有人可以向我解释一下这个函数发生了什么吗?
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/