首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保留数据类型的列表性操作

保留数据类型的列表性操作
EN

Stack Overflow用户
提问于 2017-01-27 16:34:24
回答 1查看 55关注 0票数 0

我希望能够定义一个自定义数据类型,而不是使用类型别名来确保传递正确的值,下面是它可能看起来如何的草图。

代码语言:javascript
运行
复制
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 -> DictEntrytail :: Dictionary -> Dictionary之类的实用函数。这有可能吗?有没有一些类型类,我可以定义它的一个实例,或者一个语言扩展来实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-27 17:26:39

千万不要使用head,也不要对列表或其他内容使用tail。这些都是不安全的,总是可以很容易地替换为模式匹配。

但是,确实有一个类型类,它支持类似列表的操作,或者更确切地说,支持多个类。其中最简单的是Monoid,它只实现了连接和空初始化。Foldable,允许您像列表一样解构容器。此外,Traversable还允许您在查看数据时再次组合它们。

后两种方法不太适用于Dictionary,因为它不是包含类型的参数。您可以通过切换到“monomorphic version”来绕过这一点。

但是,坦率地说,我不认为您应该这样做--只需使用标准的Map类型来存储键值关联数据,而不是使用您自己的字典类型。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41889738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档