考虑Haskell中的以下lambda函数:
(\x g n -> g (x * n))
Run Code Online (Sandbox Code Playgroud)
它需要两个参数:一个Num命名x和一个函数g,它接受一个Num命名n并返回其他东西.lambda函数返回另一个类型相同的函数g:
(\x g n -> g (x * n)) :: Num a => a -> (a -> t) -> a -> t
Run Code Online (Sandbox Code Playgroud)
我不明白的是表达式g (x * n)实际代表什么.例如,考虑以下用例:
((\x g n -> g (x * n)) 2 id)
Run Code Online (Sandbox Code Playgroud)
在这种情况下x是2和g是id.不过是什么n?什么是g (x * n)代表?通过简单的替换,它可以减少到id (2 * n).这是一样的id . (2 *)吗?如果是这样,为什么不简单地写(\x g -> g . (x *))?
我要反驳chirlu. (\x g n -> g (x * n))是一个参数的函数.
因为所有函数只接受一个参数.只是该函数返回另一个函数,它返回另一个函数.
Desugared,它是一样的
\x -> \g -> \n -> g (x * n)
Run Code Online (Sandbox Code Playgroud)
这与它的类型非常接近
Num a => a -> (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)
扩展您的用例:
(\x g n -> g (x * n)) 2 id
Run Code Online (Sandbox Code Playgroud)
让我们扩展一下
(\x -> \g -> \n -> g (x * n)) 2 id
Run Code Online (Sandbox Code Playgroud)
哪个是一样的
((\x -> \g -> \n -> g (x * n)) 2) id
Run Code Online (Sandbox Code Playgroud)
现在我们可以将内部函数应用于其参数get
(let x = 2 in \g -> \n -> g (x * n)) id
Run Code Online (Sandbox Code Playgroud)
要么
(\g -> \n -> g (2 * n)) id
Run Code Online (Sandbox Code Playgroud)
现在我们可以将此函数应用于其get参数
let g = id in \n -> g (2 * n)
Run Code Online (Sandbox Code Playgroud)
要么
\n -> id (2 * n)
Run Code Online (Sandbox Code Playgroud)
通过检查,我们可以说相当于
\n -> 2 * n
Run Code Online (Sandbox Code Playgroud)
或者,无点
(2*)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |