haskell函数声明

时间:2014-04-11 14:16:21

标签: function haskell declaration

我在理解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个输入。

非常感谢任何帮助。

1 个答案:

答案 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中,我们知道我们可以将表达式“提升”为letwhere绑定,而无需更改它。

 allEq x y = foo
   where foo z = x == y && y == z

这就是我们如何实现你的功能。