Function haskell函数声明

Function haskell函数声明,function,haskell,declaration,Function,Haskell,Declaration,我在理解Haskell函数的签名/参数/输入时遇到问题。在任何人抱怨之前,是的,我已经做了研究,但似乎找不到好的答案或解释 基本上我有一个功能: update::Eq a=>(a->b)->b->a->(a->b) 我如何理解(a->b)->b->a->(a->b)?我认为这是一个函数的输入,后跟2个值,然后输出一个函数 我有两个不同的函数做同样的事情,一个使用3个参数,另一个使用4个参数,但是头(函数的参数)是相同的 (一) (二) 它们都计算相同的东西,但我不明白为什么(1)使用4个输入“u

我在理解Haskell函数的签名/参数/输入时遇到问题。在任何人抱怨之前,是的,我已经做了研究,但似乎找不到好的答案或解释

基本上我有一个功能:

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

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

我有两个不同的函数做同样的事情,一个使用3个参数,另一个使用4个参数,但是头(函数的参数)是相同的

(一)

(二)

它们都计算相同的东西,但我不明白为什么(1)使用4个输入“updatesvxy”和 (2) “更新s v y”使用3个输入


任何帮助都将不胜感激。

欢迎来到咖喱的奇妙世界

让我们从一个简单的函数开始

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

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

您在研究中没有遇到过咖喱吗?(1) 是一个具有4个参数的函数,返回类型为b的值。(2) 是一个有3个参数的函数,返回的是一个有1个参数的函数,返回的是类型为b的值。但实际上Haskell只有一个参数的函数。所以(1)和(2)都是返回一个函数的函数,返回一个返回一个类型为b的值的函数(当然可能是函数);ghci的
:t
也这么说。删除最后一个
a->b
周围的paren只不过是权宜之计。回答得好,谢谢。只有一件事,当我在函数外部和控制台中执行此操作时,
让allEq x=\y->\z->x==y&&y==z
,它会正常工作,但是
让allEq=\x->\y->\z->x==y&&y==z
会给出一个错误,为什么?@user2371066与所谓的“单态限制”完全无关最后一件事,如果你是自由的,正如我上面所问的,我认为
(a->b)->b->a->(a->b)
是接受一个函数和2个值并输出一个函数,那么为什么我们有4个值“update s v x y”?我怎样才能正确地理解它?@user2371066记住,因为它是正确的,所以它只是
(a->b)->b->a->a->b
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
 allEq x y = foo
   where foo z = x == y && y == z