我发现一些容器有一个非常相似的功能集。例如,List,Set,Sequence,Text和Bytestrings。我想知道他们为什么不使用一个或多个常见的类型类。为什么没有类型类型的容器类型?
回答
实际上有,请参阅问题Making a single function work on lists, ByteStrings and Texts (and perhaps other similar representations),这几乎是你的副本。
在一个单独的包中,主要原因可能是它需要语言扩展 - 功能依赖或类型族。我们不得不说,Text
只能包含Char
s,ByteString
只能包含Word8
s,[]
可以包含任何类型,而Set
只能包含Ord
的实例。
他们有什么常用功能集? AFAICS,只有将多个容器合并为一个容器并生成空容器的能力。看哪,他们都是Monoid
,它提供了完全的界面!
因为有些是多态的,有些是单形的,所以你不能做任何其他的事情。
像列表多态的容器,Sequence,Maybe和Map是Functor,Foldable和Traversable类型类的实例。
对于Set你只有Foldable,如奥德例如使其无法确定其他人(你可以定义fmap
(Data.Set.map),这将遵守法律函子,但它的签署将要求论点奥德实例)。
如前所述,Text和Bytestring可以是定义类似类型类的实例,但您需要函数依赖或类型族。
[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
真的,好点。 – phadej
关于Set和Functor的更多信息:http://dorchard.wordpress.com/2011/10/18/subcategories-in-haskell-exofunctors/ – phadej
- 1. 从类型'int'分配类型't_result'时的不兼容类型,为什么?
- 2. 为什么typedef没有强类型?
- 3. 为什么字面值没有类型?
- 4. 为什么serialVersionUID的类型为Serializable类的long类型
- 5. 什么的内容脚本类型和内容样式类型
- 6. 为什么元类有一个类型?
- 7. 没有类类型
- 8. 泛型类型和泛型类型定义有什么区别?
- 9. 什么是back_inserter(容器)的类型
- 10. 什么类型的CFBundleIconFiles数组类型
- 11. 将类型的泛型容器强制转换为继承类型的容器?
- 12. E2010不兼容的类型,为什么?
- 13. 为什么不兼容的类型?
- 14. 为什么F#有两种类型的显式类型声明?
- 15. Web APi Void,IIS express内容类型,IIS没有内容类型
- 16. 类型错误:类型“类型”的对象没有LEN()
- 17. 为什么Scala的Try没有异常类型的类型参数?
- 18. 为什么空的ajax POST请求没有内容类型?
- 19. Haskell:是没有类型的类。为什么是整数?
- 20. 仅在C#中使用日期的类型 - 为什么没有日期类型?
- 21. 类类型转换:为什么类型转换功能不叫
- 22. 为什么不能模板非类型参数是类类型
- 23. 什么类型的
- 24. 为什么泛型类型的实例类与泛型类不一样?
- 25. 什么内容类型应为4xx错误没有身体?
- 26. 为什么扔类型“System.ArgumentException”
- 27. 类没有指定类型
- 28. 为什么Haskell中没有`Cofunctor`类型类?
- 29. 为什么Swift中没有混合类协议类型?
- 30. 函数有什么类型?
其实他们这样做。但是“常见类型类”的列表通常仅限于“Monoid”,“Functor”和有时候“ListLike”。我认为这是因为其他课程不存在或不够普遍。 – Yuras
顺便说一句,看一下图书馆的'lens'软件包,它已经找到了一种抽象方法来解决所有这些问题。但是它不会用新的类型类来实现,你可能会这样想。 – Carl
@Yuras - 容器应该支持Traversable和Foldable(或者有一个很好的理由不这样做)。 –