gpt4 book ai didi

function - 递增值的函数如何工作?

转载 作者:行者123 更新时间:2023-12-02 05:40:04 24 4
gpt4 key购买 nike

经过多年的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com