有人可以向我解释一下这个功能的进展情况吗?
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)
答案 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)