当前位置:  开发笔记 > 编程语言 > 正文

如何按字符串排序自定义类型

如何解决《如何按字符串排序自定义类型》经验,为你挑选了1个好方法。

我怎样才能按名字对动物进行分类?名称由String值表示.

data Animal = Cat String | Dog String | Fox String deriving (Show)

testAnimals = [(Dog "c"),(Fox "a"),(Cat "b")]

sortAnimalsByName :: [Animal] -> [Animal]
sortAnimalsByName animals = undefined

查询:

sortAnimalsByName testAnimals

应该返回:

[(Fox "a"),(Cat "b"),(Dog "c")]

我认为,功能sort :: Ord a => [a] -> [a]Data.List应使用,但如何?



1> Willem Van O..:

首先,您最好定义一个animalName函数:

animalName :: Animal -> String
animalName (Cat n) = n
animalName (Dog n) = n
animalName (Fox n) = n

只需使用sortBy其中比较简直是compareonanimalName:

import Data.Function(on)
import Data.List(sortBy)

sortAnimalsByName :: [Animal] -> [Animal]
sortAnimalsByName = sortBy (compare `on` animalName)

或者你可以 - 像@JonPurdy建议的那样使用comparing它基本上和以下相同on compare:

import Data.Ord(comparing)

sortAnimalsByName :: [Animal] -> [Animal]
sortAnimalsByName = sortBy (comparing animalName)

甚至更短:

import Data.List(sortOn)

sortAnimalsByName :: [Animal] -> [Animal]
sortAnimalsByName = sortOn animalName

animalName如果使用记录语法,还可以省略定义:

--omitting the `animalName` function
data Animal = Cat { animalName :: String} |
              Dog { animalName :: String} |
              Fox { animalName :: String} deriving (Show)

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有