haskell - 从 haskell 开始

标签 haskell

有人可以向我解释一下这个函数发生了什么吗?

applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)

我确实理解柯里化(Currying)函数是什么,可以像这样重写:

applyTwice :: ((a -> a) -> (a -> (a)))
applyTwice f x = f (f x)

但是我不完全理解 (+3) 运算符及其工作原理。也许这真的很愚蠢,但我无法弄清楚。 有人可以逐步解释该功能是如何工作的吗?谢谢=)

applyTwice :: ((a -> a) -> (a -> (a)))
applyTwice f x = f (f x)

最佳答案

Haskell 具有“运算符切片”:如果您省略运算符的一个或两个参数,Haskell 会自动将其转换为函数。

具体来说,(+3) 缺少第一个参数(Haskell 没有一元 +)。因此,Haskell 将该表达式变成一个函数,该函数接受缺少的参数,并返回输入值加 3:

-- all the following functions are the same
f1 x = x + 3
f2 = (+3)
f3 = \ x -> x + 3

类似地,如果省略两个参数,Haskell 会将其转换为具有两个(柯里化(Currying))参数的函数:

-- all the following functions are the same
g1 x y = x + y
g2 = (+)
g3 = \ x y -> x + y

来自评论:请注意,Haskell 确实有一元-。因此,(-n) 不是一个运算符切片,它只是计算负值(与 negate n 相同)。

如果您想像 + 那样对二进制 - 进行切片,则可以使用 (subtract n) 代替:

-- all the following functions are the same
h1 x = x - 3
h2 = subtract 3
h3 = \ x -> x - 3

关于haskell - 从 haskell 开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35208137/

相关文章:

data-structures - 不存在于 IO monad 中的 Haskell 哈希实现

haskell - 哪个是多态类型 : a type or a set of types?

haskell - 如何使用 Lenses 来表示 `mapM` 和 `concat` 以连接 IO 操作的结果?

haskell - 如何使用捕获

algorithm - 加速此功能的可能性是什么?

haskell - 此代码中的空间泄漏在哪里?

haskell - Agda 中固定长度向量函数中的隐式长度参数

haskell - 功能性思考。在 Haskell/Purescript 中构建新数组

if-statement - Haskell 中有多重条件 if 吗?

haskell - 理解 Haskell 中的键值构造函数