haskell函数声明

Sha*_*n C 2 haskell declaration function

我在理解Haskell函数的签名/参数/输入时遇到问题.在有人抱怨之前,是的,我已经完成了我的研究,但似乎无法找到一个好的答案或解释.

基本上我有一个功能:

update :: Eq a => (a->b) -> b -> a -> (a->b)

我如何理解(a-> b) - > b - > a - >(a-> b)?我认为它是一个函数的输入后跟2个值并输出一个函数??

我有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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

他们都计算相同的东西但我不明白为什么(1)使用4个输入"update svx y"和(2)"update sv y"使用3个输入.

任何帮助将不胜感激.

Dan*_*zer 6

欢迎来到美妙的咖喱世界.

让我们从一个简单的功能开始

allEq :: Int -> Int -> Int -> Bool
allEq x y z = x == y && y == z
Run Code Online (Sandbox Code Playgroud)

现在在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
Run Code Online (Sandbox Code Playgroud)

现在,在Haskell中,我们知道我们可以将表达式"提升"到一个letwhere绑定而不改变它.

 allEq x y = foo
   where foo z = x == y && y == z
Run Code Online (Sandbox Code Playgroud)

这就是我们如何实现您的功能.