比较类型 Haskell

Comparing on Type Haskell

我想通过比较类型对列表进行排序

type Dakar = [Piloto]
data Piloto = Carro Numero Nome Categoria
            | Mota Numero Nome Categoria
            | Camiao Numero Nome
type Numero = Int
type Nome = String
data Categoria = Competicao | Maratona

inserePil :: Piloto -> Dakar -> Dakar
inserePil p (h:t) = sortBy (compare `on` Nome) (h:p:t)

但它给了我错误。正确的做法是什么?

Nome 不是谓词,它是类型的名称。你可以做

nome :: Piloto -> Nome
nome (Carro _ n _) = n
nome (Mota _ n _) = n
nome (Camiao _ n) = n

那你就可以使用sortBy (compare `on` nome)了。但是,on compare 已经有一个函数,它是 Data.Ord.comparing,因此您可以改写

inserePil p ds = sortBy (comparing nome) (p:ds)