3

考虑 Haskell 中的以下 lambda 函数:

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

它有两个参数:一个Num命名x的和一个g接受Num命名n并返回其他内容的函数。lambda 函数返回与以下相同类型的另一个函数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)

在这种情况下x2gid。然而什么是n?代表什么g (x * n)?通过简单的替换,它可以简化为id (2 * n)。这和 一样id . (2 *)吗?如果是这样,那么为什么不简单地写(\x g -> g . (x *))呢?

4

2 回答 2

7

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

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

脱糖,和

\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 回答