3

Haskell の次のラムダ関数を考えてみましょう。

(\x g n -> g (x * n))

Num名前付きと、名前付きを受け取って別のものを返すx関数の 2 つのパラメーターgを取ります。ラムダ関数は と同じ型の別の関数を返します:Numng

(\x g n -> g (x * n)) :: Num a => a -> (a -> t) -> a -> t

私が理解していないのは、式g (x * n)が実際に何を表しているのかということです。たとえば、次の使用例を考えてみましょう。

((\x g n -> g (x * n)) 2 id)

この場合x2gですid。しかし、何nですか?とはどういう意味g (x * n)ですか? 単純な置換により、 に減らすことができますid (2 * n)。これは と同じid . (2 *)ですか? もしそうなら、なぜ単に書いてみません(\x g -> g . (x *))か?

4

2 に答える 2

7

私はchirluと矛盾するつもりです。 (\x g n -> g (x * n))引数が 1 つの関数です。

すべての関数は 1 つの引数しかとらないためです。その関数が別の関数を返し、別の関数が別の関数を返すというだけです。

脱糖、それは同じです

\x -> \g -> \n -> g (x * n)

そのタイプにかなり近いもの

Num a => a -> (a -> b) -> a -> b

ユースケースの拡張:

(\x g n -> g (x * n)) 2 id

それを拡大してみましょう

(\x -> \g -> \n -> g (x * n)) 2 id

と同じです

((\x -> \g -> \n -> g (x * n)) 2) id

これで、内部関数をその引数に適用して取得できます

(let x = 2 in \g -> \n -> g (x * n)) id

また

(\g -> \n -> g (2 * n)) id

これで、この関数をその引数に適用して取得できます

let g = id in \n -> g (2 * n)

また

\n -> id (2 * n)

これは、検査を通じて、次のものと同等であると述べることができます

\n -> 2 * n

または、ポイントフリー

(2*)
于 2013-09-13T17:19:34.103 に答える
1

あなたは近くにいます。あなたが与えた最後の例((\x g n -> g (x * n)) 2 id)は、関数の部分的な適用を表しています。の型シグネチャを持ちNum a => a -> t、次と同等です: \n -> id (2 * n).

于 2013-09-13T17:18:50.700 に答える