2013-07-17 124 views
5

我发现一些容器有一个非常相似的功能集。例如,List,Set,Sequence,Text和Bytestrings。我想知道他们为什么不使用一个或多个常见的类型类。为什么没有类型类型的容器类型?

+1

其实他们这样做。但是“常见类型类”的列表通常仅限于“Monoid”,“Functor”和有时候“ListLike”。我认为这是因为其他课程不存在或不够普遍。 – Yuras

+3

顺便说一句,看一下图书馆的'lens'软件包,它已经找到了一种抽象方法来解决所有这些问题。但是它不会用新的类型类来实现,你可能会这样想。 – Carl

+2

@Yuras - 容器应该支持Traversable和Foldable(或者有一个很好的理由不这样做)。 –

回答

9

他们有什么常用功能集? AFAICS,只有将多个容器合并为一个容器并生成空容器的能力。看哪,他们都是Monoid,它提供了完全的界面!

因为有些是多态的,有些是单形的,所以你不能做任何其他的事情。

3

像列表多态的容器,SequenceMaybeMapFunctorFoldableTraversable类型类的实例。

对于Set你只有Foldable,如奥德例如使其无法确定其他人(你可以定义fmapData.Set.map),这将遵守法律函子,但它的签署将要求论点奥德实例)。

如前所述,Text和Bytestring可以是定义类似类型类的实例,但您需要函数依赖或类型族。

+0

[Set _is_ monoid](http://hackage.haskell.org/packages/archive/containers/0.5.2.1/doc/html/src/Data-Set-Base.html#line-231):由于该类有没有多态函数/包含的类型在实例头中是固定的,它在那里表现为单态容器。 - 顺便说一下,甚至还有一种聪明的方法,可以[使其成为Functor/Applicative/Monad](http://copilotco.com/mail-archives/haskell-cafe.2007/msg00051.html);这需要在GADT中绑定'Ord'实例。 – leftaroundabout

+0

真的,好点。 – phadej

+1

关于Set和Functor的更多信息:http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej

相关问题