我在理解Haskell函数的签名/参数/输入时遇到问题。在有人抱怨之前,是的,我已经完成了我的研究,但似乎无法找到一个好的答案或解释。
基本上我有一个功能:
update :: Eq a => (a->b) -> b -> a -> (a->b)
我如何理解(a-> b) - > b - > a - > (A-> B)?我认为它是输入一个函数后跟2个值并输出一个函数??
我有两个不同的函数,它们做同样的事情,一个使用3个参数,一个使用4个但是标题(函数的参数)是相同的。
(1)
update :: Eq a => (a->b) -> b -> a -> (a->b)
update s v x y = if x==y then v else s y
(2)
update :: Eq a => (a->b) -> b -> a -> (a->b)
update s v y = ss
where ss x = if ( x == y )
then v
else s x
他们都计算相同的东西,但我不明白为什么(1)使用4个输入“update s v x y”和 (2)“update s v y”使用3个输入。
非常感谢任何帮助。
答案 0 :(得分:6)
欢迎来到美妙的咖喱世界。
让我们从一个简单的函数开始
allEq :: Int -> Int -> Int -> Bool
allEq x y z = x == y && y == z
现在在Haskell中->
是右关联的,所以这是
allEq :: Int -> (Int -> (Int -> Bool)))
allEq x y z = x == y && y == z
allEq x y = \z -> x == y && y == z
allEq x = \y -> \z -> x == y && y == z
allEq = \x -> \y -> \z -> x == y && y == z
现在,在Haskell中,我们知道我们可以将表达式“提升”为let
或where
绑定,而无需更改它。
allEq x y = foo
where foo z = x == y && y == z
这就是我们如何实现你的功能。