我最近一直在学习Haskell,我注意到可以订购String
类型(或[Char]
)。例如,这是有效的:
ghci> "foo" > "bar"
True
ghci> "?<>!" `compare` "[&*}"
LT
Haskell如何命令String
,以及此功能何时有用?
答案 0 :(得分:9)
Haskell如何命令字符串,以及此功能何时有用?
首先,Char是Ord的一个实例,由机器上底层原始char类型的相等原语给出。
instance Ord Char where
(C# c1) > (C# c2) = c1 `gtChar#` c2
(C# c1) >= (C# c2) = c1 `geChar#` c2
(C# c1) <= (C# c2) = c1 `leChar#` c2
(C# c1) < (C# c2) = c1 `ltChar#` c2
然后String被定义为[Char]
(Char列表),并且如果它们的元素具有排序,则列表通常具有排序:
instance (Ord a) => Ord [a] where
compare [] [] = EQ
compare [] (_:_) = LT
compare (_:_) [] = GT
compare (x:xs) (y:ys) = case compare x y of
EQ -> compare xs ys
other -> other
就是这样。其元素具有任何排序的任何列表将依次按顺序排列。
由于Char的基础表示按位模式排序,并且列表是按列表的元素顺序排列的,因此您可以看到String的行为。
这个功能何时有用?
答案 1 :(得分:7)
Haskell如何命令字符串,
字符串只是字符列表:
type String = [Char]
字符按Unicode代码点排序:
instance Ord Char where
c <= c' = fromEnum c <= fromEnum c'
使用词典顺序(通过列表结构和自动派生Ord
的定义隐式)比较列表:
data [a] = [] | a : [a] deriving Ord -- not actually valid Haskell :)
instance Ord a => Ord [a]
此功能何时有用?
答案 2 :(得分:2)
如果每个元素是Ord类型类的实例,则按字典顺序(即从左到右)比较2个列表。可以订购字符串,因为可以订购Char。
试试这个:
[1,2,3] < [2,3,4,5]
答案 3 :(得分:1)
我认为它是lexicographical order,无论使用何种字符编码。 (换句话说,对于ASCII或其他单字节编码,使用“字母”顺序,包含256个字符的字母。)