我希望能够定义一个自定义数据类型,而不是使用类型别名来确保传递正确的值,下面是它可能看起来如何的草图。
module Example (fromList) where
import Data.Ord (comparing, Down(..))
import Data.List (sort)
data DictEntry = DictEntry (String, Integer) deriving (Show, Eq)
instance Ord DictEntry where
(DictEntry (word1, freq1)) `compare` (DictEntry (word2, freq2))
| freq1 == freq2 = word1 `compare` word2
| otherwise = comparing Down freq1 freq2
data Dictionary = Dictionary [DictEntry] deriving (Show)
fromList :: [(String, Integer)] -> Dictionary
fromList l = Dictionary $ sort $ map DictEntry l但是,我也希望保留底层类型的“列表特性”,而不必解包装和重新包装[DictEntry],也不必定义诸如head :: Dictionary -> DictEntry和tail :: Dictionary -> Dictionary之类的实用函数。这有可能吗?有没有一些类型类,我可以定义它的一个实例,或者一个语言扩展来实现这一点?
发布于 2017-01-27 17:26:39
千万不要使用head,也不要对列表或其他内容使用tail。这些都是不安全的,总是可以很容易地替换为模式匹配。
但是,确实有一个类型类,它支持类似列表的操作,或者更确切地说,支持多个类。其中最简单的是Monoid,它只实现了连接和空初始化。Foldable,允许您像列表一样解构容器。此外,Traversable还允许您在查看数据时再次组合它们。
后两种方法不太适用于Dictionary,因为它不是包含类型的参数。您可以通过切换到“monomorphic version”来绕过这一点。
但是,坦率地说,我不认为您应该这样做--只需使用标准的Map类型来存储键值关联数据,而不是使用您自己的字典类型。
https://stackoverflow.com/questions/41889738
复制相似问题