我是Haskell的新手。谁能解释Ord a
的区别和用法?
现在,我对[a] -> [a] -> [a]
事物很熟悉。但是,
Ord a => [a] -> [a] -> [a]
请详细解释我。
答案 0 :(得分:3)
区别在于约束,Ord a => a
在这里a
的类型为a
,但没有任何a
类型,a
是{{ 1}}类型类,例如:
在这里我将稍微改变类型结果,只是为了表明您可以使用界面的功能:
Ord
在这里您可以执行所需的任何通用函数,canBeOrderedList :: Ord a => [a] -> [a] -> [Bool]
canBeOrderedList xs ys = zipWith (>) xs ys
在这里不受限制,因此可以是a
或Ord
或两者都不是,可以是函数,可以是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]