从Haskell开始

时间:2016-02-04 17:53:22

标签: haskell

有人可以向我解释一下这个功能的进展情况吗?

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

我确实理解curried函数是什么,可以像这样重写:

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

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

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

1 个答案:

答案 0 :(得分:7)

Haskell有"运算符切片":如果省略一个或两个运算符的参数,Haskell会自动将它变成一个函数。

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

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

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

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

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

如果您希望按照[{1}}的方式对二进制-进行切片,则可以改为使用+

(subtract n)