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

Aad*_*hah 3 lambda haskell

考虑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)

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

ram*_*ion 7

我要反驳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)