質問

誰かが私に説明できますか、なぜこれらの機能が持っているのですか 異なる数の議論と行動, 、 しかし 同じタイプの署名, 、しかし、彼らは両方とも正しいですか?

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つの関数の構成です gf: (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関数の単なる構文糖です。それが返す機能には、残りの引数が必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top