use*_*875 2 haskell types function currying partial-application
经过多年的OOP,我正在努力学习haskell.我正在读Happy 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
Run Code Online (Sandbox Code Playgroud)
我理解加号和加号是如何工作的(它们是相同的,不同的语法).但增量,我不明白.
increment :: Int -> Int
Run Code Online (Sandbox Code Playgroud)
意味着它需要一个int,并返回一个int,对吗?但就在那之后,实际的功能是:
increment = plus 1
Run Code Online (Sandbox Code Playgroud)
题:
整数值增量在哪里?标志x右边是否应该有一个或=哪些东西表示该函数作为输入的整数值?就像是:
increment _ = plus 1 x
Run Code Online (Sandbox Code Playgroud)
编辑:另外,不应该是增量的定义,Int -> (Int -> Int)因为它需要一个int并将它传递给一个带有int和返回的函数int?
在Haskell中,您可以使用currying和部分应用函数.看看Haskell Wiki:部分应用程序
特别是,如果你看一下任何函数的类型签名,它的输入(参数)和它的输出之间没有真正的区别,这是因为你的函数实际上plus :: Int -> Int -> Int是一个函数,当给定一个Int时,它将返回另一个函数,本身获取剩余的参数并返回int : Int -> Int. 这称为部分应用
这意味着当你调用时,increment = plus 1你说增量等于 - 记住部分应用程序 - 一个函数(返回plus 1),它本身取一个整数并返回一个整数.
由于Haskell是一种函数式编程语言,所有具有相同的东西不是赋值,而更像是一个定义,因此理解部分应用程序的简单方法实际上是遵循等号:
increment = plus 1 =
plus 1 y = 1 + y
Run Code Online (Sandbox Code Playgroud)
如您所见,部分应用程序可用于定义更具体的功能,例如将1添加到一个更具体的数字,而不仅仅是添加两个数字.它还允许更多地使用无点样式,在这种情况下,您可以连接多个函数.
另请注意,使用中缀函数lke (+),您可以部分应用于左侧或右侧,这对非交换函数非常有用,例如
divBy2 :: Float -> Float
divBy2 = (/2)
div2by :: Float -> Float
div2by = (2/)
Prelude> divBy2 3
1.5
Prelude> div2by 2
1.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |