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个输入.
任何帮助将不胜感激.
欢迎来到美妙的咖喱世界.
让我们从一个简单的功能开始
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中,我们知道我们可以将表达式"提升"到一个let或where绑定而不改变它.
allEq x y = foo
where foo z = x == y && y == z
Run Code Online (Sandbox Code Playgroud)
这就是我们如何实现您的功能.