- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
经过多年的 OOP,我正在努力学习 haskell。我在读《快乐的 haskell 》。它提供了这段代码:
plus :: Int -> Int -> Int
plus x y = x + y
plus' :: Int -> Int -> Int
plus' = \x -> \y -> x + y
increment :: Int -> Int
increment = plus 1
increment' :: Int -> Int
increment' = (\x -> \y -> x + y) 1
我了解 plus 和 plus' 的工作原理(它们是相同的,但语法不同)。但是增量,我不明白。
increment :: Int -> Int
意味着它接受一个 int,并返回一个 int,对吗?但在那之后,实际功能是:
increment = plus 1
问题:
整数值增量在哪里? =
符号的右边不应该有一个 x
或其他东西,以表示该函数作为输入的整数值吗?像这样的东西:
increment _ = plus 1 x
编辑:此外,增量的定义不应该是 Int -> (Int -> Int)
因为它需要一个 int
并将其传递给一个函数获取 int
并返回 int
?
最佳答案
在 Haskell 中,您可以对函数进行柯里化(Currying)和部分应用。看看Haskell Wiki: Partial Application
特别是,如果你查看任何函数的类型签名,它的输入(参数)和输出之间没有真正的区别,这是因为你的函数 plus::Int -> Int -> Int
是一个函数,当给定一个 Int 时,它将返回另一个函数,该函数本身接受剩余的参数并返回 int:Int -> Int
。这称为部分应用
这意味着当您调用 increment = plus 1
时,您说的是 increment 等于——记住部分应用程序——一个函数(由 plus 1
返回) 本身接受一个整数并返回一个整数。
由于 Haskell 是一种函数式编程语言,所有带等号的都不是赋值,而更像是一个定义,因此理解部分应用的一个简单方法就是真正遵循等号:
increment = plus 1 =
plus 1 y = 1 + y
如您所见,偏应用可用于定义更具体的函数,例如将一个数字加 1,这比仅将两个数字相加更具体。它还允许更多地使用无点样式,您可以在其中连接多个函数。
另请注意,使用中缀函数 lke (+)
,您可以部分应用于左侧或右侧,这对于非交换函数很有用,例如
divBy2 :: Float -> Float
divBy2 = (/2)
div2by :: Float -> Float
div2by = (2/)
Prelude> divBy2 3
1.5
Prelude> div2by 2
1.0
关于function - 递增值的函数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896826/
我是一名优秀的程序员,十分优秀!