Haskell如何命令字符串?

时间:2010-06-27 03:03:02

标签: string sorting haskell

我最近一直在学习Haskell,我注意到可以订购String类型(或[Char])。例如,这是有效的:

ghci> "foo" > "bar"
True
ghci> "?<>!" `compare` "[&*}"
LT

Haskell如何命令String,以及此功能何时有用?

4 个答案:

答案 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的行为。

  

这个功能何时有用?

用于将字符串插入到多态的数据结构中,但需要使用Ordering方法。最值得注意的是SetMap

答案 1 :(得分:7)

  

Haskell如何命令字符串,

以下是Haskell Prelude

中的一些定义

字符串只是字符列表:

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]
  

此功能何时有用?

您需要Ord的实例才能使用MapSet等内容。

答案 2 :(得分:2)

如果每个元素是Ord类型类的实例,则按字典顺序(即从左到右)比较2个列表。可以订购字符串,因为可以订购Char。

试试这个:

[1,2,3] < [2,3,4,5]

答案 3 :(得分:1)

我认为它是lexicographical order,无论使用何种字符编码。 (换句话说,对于ASCII或其他单字节编码,使用“字母”顺序,包含256个字符的字母。)