仅供参考:进入 Haskell 的第二天
MRE(该函数的作用不重要):
foo :: Int -> Int -> Int
foo x y
| x == y = x + y
| x < y = x
| x > y = y
这是我->
迄今为止收集到的有关操作员(?)的信息:
- 右结合
- 它用于函数类型声明中,表示函数参数的类型及其返回类型
现在看一下以下函数类型声明:
foo :: Int -> Int
这声明(什么是合适的词?)一个名为的函数foo
,它接受一个Int
并返回一个Int
。
但是,声明:foo :: Int -> Int -> Int
declares(?)foo
接受 2Int
并返回一个,Int
这与说foo :: Int -> (Int -> Int)
哪个函数接受一个Int
并返回一个函数相同,该函数接受一个Int
并返回一个Int
。
这怎么讲得通呢?难道不应该是这样的吗Int,Int -> Int
?
PS:我正在使用的书:Richard Bird 的《使用 Haskell 进行函数式思考》。
没有函数需要两个参数。所有函数都只接受一个参数。事实上,我们可以这样写:
那么
foo 2
做了什么?它构造了一个新函数,该函数将接受Int
并返回。它本质上是的Int
“特殊”版本。foo
x = 2
因此
foo :: Int -> Int -> Int
,就像你的直觉所说的那样Int -> (Int -> Int)
:它接受一个参数,一个Int
,并构造一个函数,然后该函数将接受“第二个”参数。您还可以制作以下“非柯里化”版本
foo
:现在它再次采用一个参数:一个具有两个 s 的 2 元组
Int
,但因此只有一个参数。如果您想要将参数“分组”在一起或取消分组,则经常会在两种样式之间进行转换。因此有[Hackage]和[Hackage],所以,和。
uncurry :: (a -> b -> c) -> (a, b) -> c
curry :: ((a, b) -> c) -> a -> b -> c
foo' = uncurry foo
foo = curry foo'