![](/img/trans.png)
[英]Haskell terminology: meaning of type vs. data type, are they synonyms?
[英]The meaning of <= vs. => in Haskell
我对Haskell比较陌生; <=
语法代表什么? <=
和=>
什么区别? 两者的示例都将有所帮助。
两者是完全无关的。 它们似乎只是因为ASCII而相关。 如果看一下它们的Unicode等效项,则更有意义:
=>
是箭头: ⇒
。 它用于指定类型签名中的约束:
Eq a => a -> a -> Bool
上述签名中的Eq a =>
表示类型变量a
可以是Eq
类实例的任何类型。 也就是说,任何具有deriving (Eq)
或显式实例(例如instance Eq Type where ...
。
在函数签名中, ->
指定普通参数,而=>
指定签名中的约束 。 在上面的示例中( Eq a => a -> a -> Bool
),该函数接受a
类型a
两个参数,并给我们一个Bool
。 Eq a =>
部分不是该函数的显式参数; 它只是告诉我们a
必须是Eq
一部分(也就是说,它必须与==
相当)。
<=
小于或等于 。 也就是说,它是≤
, 而不是 ⇐
。 这是Ord
类一部分的标准库中的普通函数:
λ> :t (<=) (<=) :: Ord a => a -> a -> Bool
您可以在正则表达式中使用它:
λ> 10 <= 12 True
他们似乎对称的唯一原因是因为ASCII逼近≤
和⇐
是相同的,但是这只是在符号的限制。 否则,它们是完全无关的。
您可以在代码中使用明确的Unicode符号。 UnicodeSyntax
扩展允许对=>
使用⇒
,并且base-unicode-symbols
软件包包含标准库函数的Unicode版本,其中对<=
包括≤
。
他们是完全不同的东西。
=>
(以及->
)是内置的类型级别语法。 它用于表示约束。 例如签名
abs :: Num a => a -> a
告诉您abs
函数采用类型的值a
并且产生相同类型的一个值,在该条件下a
是一个数字类型(即,满足Num a
约束)。 这样的约束通常是†一个类型类 ; 在这种情况下
class Num a where ...
您可以阅读=>
箭头作为排序的函数映射,太: abs
首先需要的是什么一些具体种类的信息a
是作为“隐含参数”,那么这样的一个数字作为一个明确的说法,然后才给结果。
<=
不是语法,它只是标准库中定义的中缀运算符。 具体来说,它是数学运算符≤的小于运算符。
您可以在Hayoo上查找此类运算符,而无需询问有关它们的问题。
† 严格来说,一类是不是约束,而是“约束构造方法”,即一类级别的功能,其结果是怎么样的Constraint
。 例如,将Num :: * -> Constraint
应用于例如Int :: *
表示Num Int
是一个约束。 (那些不是类型签名,而是类型签名 ,即“类型级别事物的类型”。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.