![](/img/trans.png)
[英]How does function application with the $ operator curry in Haskell?
[英]How does curry (==) work?
我明白那个:
(==):: Eq a => a - > a - > Bool
应用程序的示例可以是(==)2 2,结果为True。
然后:
uncurry(==):: Eq b =>(b,b) - > Bool。
应用程序的示例可能是uncurry(==)(2,2),结果为True。
但我不明白并想象一个例子为什么:
咖喱(==)::(Eq a,Eq b)=> a - > b - >(a,b) - > Bool
有帮助吗?
谢谢,
塞巴斯蒂安
==
可以在元组上使用,也就是你可以写(a1, b1) == (a2, b2)
。
在这种情况下, ==
的类型专门用于(Eq a, Eq b) => (a, b) -> (a,b) -> Bool
。
如果您现在将curry
应用于该类型,则得到(Eq a, Eq b) => a -> b -> (a, b) -> Bool
。
curry
的定义是:
curry :: ((a, b) -> c) -> a -> b -> c
curry f = \x y -> f (x, y)
如果我们用以下代替:
\x y z -> (curry (==) x y) z
\x y z -> ((==) (x, y)) z -- Function application
\x y z -> (==) (x, y) z -- Remove parentheses (function application is left associative in Haskell, so they are unnecessary here)
\x y z -> (x, y) == z -- Convert to infix
我们可以立刻知道z
必须是某种元组,否则最后一行不会进行类型检查,因为==
两个参数必须具有相同的类型。
当我们查看Eq
的元组实例的定义时,我们发现
instance (Eq a, Eq b) => Eq (a, b) where
(x, y) == (x', y') = (x == x') && (y == y')
(这不是在标准库的源代码中拼写出来的,它实际上使用“独立派生”机制来自动派生(Eq a, Eq b) => (a, b)
类型的实例。相当于得到的东西。)
所以,在这种情况下,我们可以将==
视为具有类型
(==) :: (Eq a, Eq b) => (a, b) -> (a, b) -> Bool
x
和y
必须具有Eq
实例的类型,但它们不需要是Eq
的相同实例。 例如,如果我们有12
和"abc"
怎么办? 这是两种不同的类型,但我们仍然可以使用我们的函数,因为它们都是Eq
实例: (\\xyz -> (x, y) == z) (12, "abc") (30, "cd")
(此表达式类型检查并计算为False
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.