在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)
,x
为2
。但是g
是什么? id
代表什么?通过简单的替换,它可以减少到n
。这与g (x * n)
相同吗?如果是这样,为什么不简单地写id (2 * n)
?
答案 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)
。