3

私はHaskellの関数型に本当にこだわっています。与えられた2つの関数のタイプがあり、それらの本当の違いは何であるかを説明することはできません。

a :: Int -> (Int -> (Int -> (Int -> Int)))

b :: (((Int -> Int) -> Int) -> Int) -> Int

私はまだポイントを取得していません。カリー化の目的はわかっていますが、この例ではカリー化の概念がわかりません。

関数a:anが渡され、結果は...などIntをとる別の関数になります。Int

関数b:これは関数Aとどう違うのですか?

4

2 に答える 2

7

おそらく最善の方法は、2つの単純な関数について考えることです。

f :: a -> (b -> c)
g :: (a -> b) -> c

これらの関数を順番に見ていきましょう。

最初の関数、fは、型の単一のパラメーターを取り、型aの関数を返しますb -> c。つまり、、、、および:を想定してx :: a、次のように記述できます。y :: bz :: c

f :: a -> (b -> c)
f x = f'
  where f' :: b -> C
        f' y = z

の署名を書く別の方法fは次のとおりです。

f :: a -> b -> c

これは、デフォルトで->右側にバインドするために機能します。また、別の同等の理解方法も提供します。これは、型との2つのパラメーターを取り、型の結果を生成するf関数と考えることができます。abc

2番目の関数gは、型の関数である1つの引数を取りますa -> b

g :: (a -> b) -> c
g h = z
  where h :: a -> b

したがって、2つは非常に異なります。

これを関数に適用すると、最初の関数は4つのタイプの値を取りInt、を返しますInt。2番目の関数は型の単一((Int -> Int) -> Int) -> Intの関数を取り、それは型の3番目の関数を取り、(Int -> Int)を生成する関数ですInt

于 2013-03-01T18:49:08.410 に答える
3

関数bは引数として関数を取ります-結果として関数を生成しません。それは大きな違いです:

a 42追加の引数を取る関数を生成します。は関数ではないb 42ため、型エラーが発生します。ここで、タイプは。を生成します。は整数ではないため、型エラーが発生します。42b myfunmyfun((Int -> Int) -> Int) -> Int)Inta myfunmyfun

于 2013-03-01T18:47:36.360 に答える