< = vs. =>的含义在哈斯克尔

时间:2016-05-29 00:32:38

标签: haskell

我对Haskell比较陌生; <=语法代表什么,<==>之间有什么区别?两者的例子都会有所帮助。

2 个答案:

答案 0 :(得分:5)

这两者完全不相关;它们似乎因为ASCII而相关。如果你看一下它们的Unicode等价物就更有意义了:

  • =>是一个箭头:。它用于指定类型签名中的约束:

    Eq a => a -> a -> Bool
    

    上述签名中的Eq a =>表示类型变量a可以是Eq类的实例的任何类型。也就是说,任何具有deriving (Eq)的类型或类似instance Eq Type where ...的显式实例。

    在功能签名中,->指定正常参数,而=>指定签名中的约束。在上面的示例(Eq a => a -> a -> Bool)中,该函数采用类型a的两个参数,并为我们提供BoolEq a =>部分不是函数的显式参数;它只是告诉我们a必须是Eq的一部分(也就是说,它必须与==相当)。

  • <= 小于或等于。也就是说,它是不是 。它是标准库中的常规函数​​,它是Ord类的一部分:

    λ> :t (<=)
    (<=) :: Ord a => a -> a -> Bool
    

    您可以在正常表达式中使用它:

    λ> 10 <= 12
    True
    

它们看似对称的​​唯一原因是因为的ASCII近似是相同的,但这只是符号的限制。否则,他们完全没有关系。

您可以在代码中使用明确的Unicode符号。 UnicodeSyntax扩展程序允许使用=>base-unicode-symbols包中包含Unicode版本的标准库函数,包括 <=

答案 1 :(得分:3)

他们完全不同。

  • =>(以及->)是内置的类型级语法。它用于表示约束。例如,签名

    abs :: Num a => a -> a
    

    告诉您abs函数采用类型a的值并生成相同类型的值,条件a是数字类型(即,履行{ {1}}约束)。这样的约束通常是 a 类型;在这种情况下

    Num a

    您也可以将class Num a where ... 箭头视为排序函数映射:=>首先获取的具体数字abs是作为“隐式参数”,然后将一个这样的数字作为显式参数,然后才给出结果。

  • a不是语法,它只是标准库中定义的中缀运算符。具体来说,它是小于运算符,数学家写
    您可以在Hayoo上查找此类运算符,无需询问有关它们的问题。 / p>

严格来说,类不是约束,而是“约束构造函数”,即结果类型{{em]的类型级函数3}}。例如,<=适用于例如Num :: * -> Constraint表示Int :: *是约束。 (这些不是类型签名,而是种类签名,即“类型级别的东西”。)