【发布时间】:2016-10-24 08:44:28
【问题描述】:
我有一个数据类型:
data Box a b = Box a b
我想创建一个Box 的Foldable 实例,并且由于必须为Foldable 实例提供类似* -> * 的东西,我将实例声明为:
instance Foldable (Box a) where
foldr f x (Box r s) = undefined
现在我只能这样做:
foldr f x (Box r s) = f s x
在foldr 的定义中,但如果不是在s 上操作,我想这样做:
foldr f x (Box r s) = f r x
编译器不允许我这样做,那么正确的方法是什么?
【问题讨论】:
-
@chi oops - 谢谢......遗憾的是,编辑这个东西已经太晚了,我不知道它是否有任何价值......所以我想我会删除它
-
正确的方法?一些选项。 1.不要使用
Foldable,因为你想要一些语义不同的东西。 2. 制作type B a = Box a a ; instance Foldable B where,然后折叠两个元素。 3.为新类型包装器newtype FlipBox a b = FBox (Box b a) ; instance Foldable (FlipBox a) where ...创建一个实例。 -
@ThomasMDuBuisson,您不能将类型同义词作为类的实例。
-
@dfeuer 是的,你可以。放松。 :)
-
一般你可以使用
TypeSynonymInstances,但在这种情况下会失败,因为它们必须完全饱和,例如声明,因此你不能让B本身成为任何东西的实例@987654336 @ 对于一些a,这违背了目的......
标签: haskell instance typeclass foldable