在Haskell中,当我们讨论类型声明时。
我见过->
和=>
。
举个例子:我可以自己声明类型。
addMe :: Int -> Int -> Int
addMe x y = x + y
而且它工作得很好。
但是如果我们看一下:t sqrt
,我们会得到:
sqrt :: Floating a => a -> a
我们在什么时候使用=>
,什么时候使用->
?我们什么时候用“胖箭头”,什么时候用“瘦箭头”?
发布于 2019-06-26 04:28:00
“细箭头”用于函数类型(t1 -> t2
是接受t1
类型的值并生成t2
类型的值的函数的类型)。
“胖箭头”用于类型约束。它将多态函数上的类型约束列表与类型的其余部分分开。因此,在给定Floating a => a -> a
的情况下,我们有了函数类型a -> a
,该函数的类型可以接受任何类型a
的参数,并生成该类型的结果,并添加了约束Floating a
,这意味着该函数实际上只能与实现Floating
类型类的类型一起使用。
发布于 2019-06-28 01:33:26
->
是函数的构造器,=>
用于约束,这是一种在Haskell中称为类型类的“接口”。
下面是一个小示例:
sum :: Int -> Int -> Int
sum x y = x + y
该函数只允许Int类型,但如果你想要一个大的int或一个小的int,你可能想要Integer,如何告诉它同时使用这两种类型?
sum2 :: Integral a => a -> a -> a
sum2 x y = x + y
现在,如果您尝试这样做:
sum2 3 1.5
它会给你一个错误
此外,您可能想知道两个数据是否相等,您希望:
equals :: Eq a => a -> a -> Bool
equals x y = x == y
现在如果你这样做了:
3 == 4
没关系
但是如果你创建了:
data T = A | B
equals A B
它将为您提供:
error:
• No instance for (Eq T) arising from a use of ‘equals’
• In the expression: equals A B
In an equation for ‘it’: it = equals A B
如果你想让它工作,你必须这样做:
data T = A | B deriving Eq
equals A B
False
https://stackoverflow.com/questions/56761514
复制相似问题