我偶然发现了关于hackage的OneTuple包。我想知道它的目的,我确信作者并不是为了它的乐趣而创造它。那么这什么时候有用呢?很清楚它的作用,但不会在人们使用它的时候。
那么,任何人都知道任何一个很好的例子,你可以从中受益吗?或者也许展示它背后的数学美?
答案 0 :(得分:4)
它与Identity
monad几乎相同,后者通常用作monad变换器堆栈的基础,但由于OneTuple
使用data
而不是newtype
它有一个额外的底值。
这很有趣,因为它在某种意义上是它实现的大多数类型类的最简单的例子。不过,我认为它没有太多实际用途。
答案 1 :(得分:4)
假设你有一个(稍微愚蠢的)类型类对元组进行操作。您有(a,a)
的实例,(a,a,a)
的实例。您还需要一个实例作为单个值。但你不能只为a
创建一个实例,因为这会与其他一切重叠!但是,您可以为OneTuple a
创建一个实例。
现在类型类有点无用了,但是很容易想象一个类型类差不多但更有用。实际上,这正是在bos的mysql库中使用Only
:http://hackage.haskell.org/packages/archive/mysql-simple/0.2.0.2/doc/html/Database-MySQL-Simple-QueryResults.html
答案 2 :(得分:3)
这肯定是不是一个笑话,就像身份monad实现不是一个笑话一样。与普通类型a
不同,您可以获得所有有用的实例,并获得额外的底部,这使得单例元组更接近其他元组类型的语义。
一个用例就像身份monad一样,泛化。你有一个applicative / monadic函数,它有一个多态函数类型。例如,许多有用的包如枚举器支持在用户选择的monad上操作。 OneTuple
(与Identity
相比)稍微不同的语义可能非常有用,当您有复杂的数据依赖关系或想要利用额外的懒惰时,Identity
不会给出你。
答案 3 :(得分:2)
我认为这是一个笑话,比如don't包。也就是说,OneTuple
确实为任何类型添加了一个新值(与Maybe
相对,后者增加了两个:Nothing
和Just undefined
或undefined
取决于你的船如何摇摆)。所以,如果事实证明你需要它,你知道去哪里......