質問
誰かが私に説明できますか、なぜこれらの機能が持っているのですか 異なる数の議論と行動, 、 しかし 同じタイプの署名, 、しかし、彼らは両方とも正しいですか?
comp1 :: (a -> b) -> (b -> c) -> a -> c
comp1 f g = g.f
comp2 :: (a -> b) -> (b -> c) -> a -> c
comp2 f g x = g (f x)
また、Comp2にはなぜありますか
comp2 :: (a -> b) -> (b -> c) -> a -> c
のようなものではなく
comp2 :: a -> (a -> b) -> (b -> c) -> a -> c
?
ありがとうございました。
解決
comp2 f g x = g (f x)
構文砂糖です
comp2 = \f -> \g -> \x -> g (f x)
同様に
comp1 f g = g.f
砂糖です
comp1 = \f -> \g -> g.f
の定義 .
は:
f1 . f2 = \x -> f1 (f2 x) -- Names of arguments have been changed to avoid confusion
したがって、定義をデスガーされた形に挿入した場合 comp1
, 、 我々が得る:
comp1 = \f -> \g -> \x -> g (f x)
これは、の脱gされた形とまったく同じです comp2
, 、したがって、明らかに定義は同等です。
他のヒント
comp1 f g = g.f
書かれています ポイントフリー スタイル(ポイントを指すのではなく、 値)。あなたが電話するとき comp1
, 、暗黙的に3番目のパラメーターが渡されます g.f
, 、これは2つの関数の構成です g
と f
: (g.f) x
平等です g (f x)
, 、すなわち g
の結果に合格されます f x
. 。パラメーターなし x
に存在します comp1
それは暗黙的に関数に渡されているからです。 (あなたは考えることができます comp1
として 部分的に適用されます また カレー 気分が良くなる場合は機能します。)
comp2
のタイプは2つの関数を求めます。1つは (a->b)
そして別の (b->c)
, 、およびタイプのパラメーター a
. 。置く必要はありません a ->
その署名で。
2つの関数は本当に同等です。いくつかのHaskellトリックを使用して、より簡潔にするだけです。
カリー. 。 MLとHaskellのマルチアーグメント関数は、関数を返す1つのargument関数の単なる構文糖です。それが返す機能には、残りの引数が必要です。
所属していません StackOverflow