“ Ord a => [a]-> [a]-> [a]”和“ [a]-> [a]-> [a]”之间有什么区别

时间:2019-08-08 14:25:31

标签: list haskell

我是Haskell的新手。谁能解释Ord a的区别和用法?

现在,我对[a] -> [a] -> [a]事物很熟悉。但是,

Ord a => [a] -> [a] -> [a]

请详细解释我。

2 个答案:

答案 0 :(得分:3)

区别在于约束,Ord a => a在这里a的类型为a,但没有任何a类型,a是{{ 1}}类型类,例如:

在这里我将稍微改变类型结果,只是为了表明您可以使用界面的功能:

Ord

在这里您可以执行所需的任何通用函数,canBeOrderedList :: Ord a => [a] -> [a] -> [Bool] canBeOrderedList xs ys = zipWith (>) xs ys 在这里不受限制,因此可以是aOrd或两者都不是,可以是函数,可以是Ints可以是任何东西

Eq

如此:

anyListTypeConcat :: [a] -> [a] -> [a]
anyListTypeConcat xs ys  = xs ++ ys 

在这里,您将这两个列表放在一起,到目前为止,效果很好,在这里:

anyListTypeConcat [True, False] [False, True]
=> [True,False,False,True]

您可以将(>)与数字一起使用,但是呢:

canBeOrderedList [1,2,3] [4,1,2]
=> [False,True,True]

但是:

data Some = A | B | C deriving (Eq, Show)

anyListTypeConcat [A, A] [B, C]
=> [A,A,B,C]

您不能订购该列表,但可以更改数据类型:

canBeOrderedList [A,A,B] [C,A,A]
 error:
    • No instance for (Ord Some)
        arising from a use of ‘canBeOrderedList’
    • In the expression: canBeOrderedList [A, A, B] [C, A, A]
      In an equation for ‘it’: it = canBeOrderedList [A, A, B] [C, A, A]

本质上就是区别

答案 1 :(得分:2)

考虑:

-- merge :: [a] -> [a] -> [a]  ?
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys)
  | y < x     = y : merge (x:xs) ys
  | otherwise = x : merge xs (y:ys)

尤其要看倒数第二行。看到那个(<)运算符了吗?

ghci> :i (<)
class Eq a => Ord a where
  ...
  (<) :: a -> a -> Bool

我们在这里可以看到,对于非Ord类的类型,小于运算符不存在;因此,除非我们有merge,否则Ord a函数没有任何意义。因此,我们将其类型签名重写为:

merge :: Ord a => [a] -> [a] -> [a]