【问题标题】:How to create a Foldable instance of a type with multiple parameters in Haskell?如何在 Haskell 中创建具有多个参数的类型的可折叠实例?
【发布时间】:2016-10-24 08:44:28
【问题描述】:

我有一个数据类型:

data Box a b = Box a b

我想创建一个BoxFoldable 实例,并且由于必须为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


【解决方案1】:

你已经找到了答案——你只是不喜欢它。无法按照您的要求进行操作,因为唯一可能的行为是由foldr 的签名修复的。

建议使用新类型 newtype Flip t a b = Flip {unFlip :: (t b a)} 并定义适当的实例是解决此问题的最标准方法,现在您可以将折叠写入 Flip Box 而不是 Box

【讨论】:

    【解决方案2】:

    您必须将实例声明为: instance Foldable Box where ... (框一):: *

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多