Haskell: 有两个参数的匿名函数
Haskell: anonymous function with two arguments
我有以下匿名函数:
(\x y -> y+y) (5*(7+20))
据我了解匿名函数,x 应该是 (5*(7+20)) 而 y 没有给出(这是可疑的地方)。当我尝试执行该功能时,GHCI 告诉我 return 值是
Integer -> Integer
很明显我的解释在这里是错误的,我就是不明白为什么。谁能给我解释一下这里发生了什么?
只给一个有两个参数的函数会导致该函数的 partial application,其结果是一个(剩余的)参数的函数。在您的情况下,返回函数的签名是 Integer -> Integer
.
这样看:如果您为 y 提供了一个值,您将得到一个整数。如果你不提供一个值,你会得到一个表达式,它接受一个整数(你称之为 y)和 returns 一个整数,即一个函数
Integer -> Integer
这也适用于命名函数。例如。
plus :: Int -> Int -> Int
plus x y = x + y
你可以在ghci中查看plus 1
的类型是Int -> Int
。事实上,这个过程适用于 Haskell 中的任何函数。您可以在 HaskellWiki.
阅读更多内容
注意
\x y -> y+y
是
的语法糖
\x -> (\y -> y+y)
即与其说“一个有两个参数的 lambda 函数”,不如说它是一个只有一个参数的函数。 return 类型恰好又是一个函数。
这种 currying 技术对于编写好的 Haskell 代码非常重要;部分应用程序使许多事情变得非常简洁而不牺牲可读性。例如,
GHCi> map (logBase 2) [1,2,4,8,16]
[0.0, 1.0, 2.0, 3.0, 4.0]
这里我使用了 logBase
作为单个参数 (2
) 的函数,这给了我一个简单的数字→数字函数,可以映射到一个列表上。如果没有柯里化,我需要写 map (\x -> logBase(2,x)) [1,2,4,8,16]
.
我有以下匿名函数:
(\x y -> y+y) (5*(7+20))
据我了解匿名函数,x 应该是 (5*(7+20)) 而 y 没有给出(这是可疑的地方)。当我尝试执行该功能时,GHCI 告诉我 return 值是
Integer -> Integer
很明显我的解释在这里是错误的,我就是不明白为什么。谁能给我解释一下这里发生了什么?
只给一个有两个参数的函数会导致该函数的 partial application,其结果是一个(剩余的)参数的函数。在您的情况下,返回函数的签名是 Integer -> Integer
.
这样看:如果您为 y 提供了一个值,您将得到一个整数。如果你不提供一个值,你会得到一个表达式,它接受一个整数(你称之为 y)和 returns 一个整数,即一个函数
Integer -> Integer
这也适用于命名函数。例如。
plus :: Int -> Int -> Int
plus x y = x + y
你可以在ghci中查看plus 1
的类型是Int -> Int
。事实上,这个过程适用于 Haskell 中的任何函数。您可以在 HaskellWiki.
注意
\x y -> y+y
是
的语法糖\x -> (\y -> y+y)
即与其说“一个有两个参数的 lambda 函数”,不如说它是一个只有一个参数的函数。 return 类型恰好又是一个函数。
这种 currying 技术对于编写好的 Haskell 代码非常重要;部分应用程序使许多事情变得非常简洁而不牺牲可读性。例如,
GHCi> map (logBase 2) [1,2,4,8,16]
[0.0, 1.0, 2.0, 3.0, 4.0]
这里我使用了 logBase
作为单个参数 (2
) 的函数,这给了我一个简单的数字→数字函数,可以映射到一个列表上。如果没有柯里化,我需要写 map (\x -> logBase(2,x)) [1,2,4,8,16]
.