我只是偶然发现了包裹OneTuple的瑕疵。我想知道它的目的,我确信作者并没有为了它的乐趣而创建它。那么什么时候这可能有用?它很清楚它的作用,但不会在什么时候使用它。什么时候会想要使用OneTuple?
那么,有谁知道任何很酷的例子,当你可以从中受益?或者也许显示它背后的数学美?
我只是偶然发现了包裹OneTuple的瑕疵。我想知道它的目的,我确信作者并没有为了它的乐趣而创建它。那么什么时候这可能有用?它很清楚它的作用,但不会在什么时候使用它。什么时候会想要使用OneTuple?
那么,有谁知道任何很酷的例子,当你可以从中受益?或者也许显示它背后的数学美?
这几乎是一样的Identity
单子,其通常用作单子变压器堆叠的基础上,所不同的是,因为使用OneTuple
的data
代替newtype
它有一个额外的底部值。
这很有趣,因为它是在一定意义上的大部分它实现了类型类的最简单的例子。虽然我没有看到太多的实际用途。
我只能看到创建额外的间接层的实际用途,例如为了安全评估内部的thunk。 – fuz
假设你有一个(略带傻气)类型类上的元组进行操作。您有一个(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
这肯定是不一个笑话,就像身份单子实现不是一个笑话。与普通类型a
不同,您可以获得所有有用的实例,并获得额外的底部,从而使单身元组更接近其他元组类型的语义。
的一个用例是这样的,就像身份单子,泛化。你有一个applicative/monadic函数,它有一个多态函子类型。例如,许多有用的软件包,例如的枚举器支持在用户选择的monad上运行。 OneTuple
(与Identity
相比)稍微不同的语义可能非常有用,当您有复杂的数据依赖性或想要使用额外的懒惰时,Identity
不会给您。
“我确定作者并没有为了它的乐趣而创建它” - 您可能会低估Haskell社区的幽默感。 – MatrixFrog
青蛙说什么。请参阅极致套装类别,了解没有真正原因的套装示例。 –