代码之家  ›  专栏  ›  技术社区  ›  Ben

Haskell是如何排序字符串的?

  •  4
  • Ben  · 技术社区  · 14 年前

    我最近在学习Haskell,我注意到 String 类型(或 [Char]

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

    哈斯克尔是怎么点菜的 s、 这个功能什么时候有用?

    4 回复  |  直到 14 年前
        1
  •  9
  •   Don Stewart    14 年前

    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
    

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

    用于将字符串插入多态但需要排序方法的数据结构中。最引人注目的是 Set Map .

        2
  •  7
  •   porges    14 年前

    这里有一些来自 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]
    

    这个功能什么时候有用?

    作战需求文件 使用类似 Map Set .

        3
  •  2
  •   Phil    14 年前

    如果每个元素都是Ord类型类的一个实例,那么两个列表按字典顺序(即从左到右)进行比较。字符串可以排序,因为字符可以排序。

    试试这个:

    [1,2,3] < [2,3,4,5]
    
        4
  •  0
  •   Amber    14 年前

    lexicographical order ,而不是使用任何字符编码(换言之,“字母顺序”带有a,对于ASCII或其他单字节编码,为256个字符的字母表。)