增加值的函数如何工作?

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

Lor*_*nzo 5

部分申请

在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)