Haskell中的以下lambda函数实际上返回了什么?

时间:2013-09-13 16:56:12

标签: haskell lambda

在Haskell中考虑以下lambda函数:

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

它有两个参数:一个名为Num的{​​{1}}和一个名为x的{​​{1}}的函数g,并返回其他内容。 lambda函数返回与Num相同类型的另一个函数:

n

我不明白的是g表达式实际代表什么。例如,考虑以下用例:

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

在这种情况下,g (x * n)((\x g n -> g (x * n)) 2 id) x2。但是g是什么? id代表什么?通过简单的替换,它可以减少到n。这与g (x * n)相同吗?如果是这样,为什么不简单地写id (2 * n)

2 个答案:

答案 0 :(得分:7)

我要反驳chirlu。 (\x g n -> g (x * n))是一个参数的函数。

因为所有函数只接受一个参数。只是该函数返回另一个函数,它返回另一个函数。

Desugared,它与

相同
\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

现在我们可以将内部函数应用于其参数get

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

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

现在我们可以将此函数应用于其参数get

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

\n -> id (2 * n)

其中,通过检查,我们可以陈述等同于

\n -> 2 * n

或者,无点

(2*)

答案 1 :(得分:1)

你很亲密。您给出的最后一个示例,((\x g n -> g (x * n)) 2 id)表示该函数的部分应用程序。它的类型签名为Num a => a -> t,相当于以下内容:\n -> id (2 * n)