Haskell"不"类型约束

Jon*_*han 7 haskell types

我试图以归纳方式定义一对类实例.那是:

class Foo a b | a -> b where
  foo :: a -> b

instance (not?)Foo a => Bar a b
  foo x = ...

instance Foo a => Bar a b
  foo x = ...
Run Code Online (Sandbox Code Playgroud)

第一个实例确定基本操作,秒递归调用foo.有没有办法做到这一点?一个很好的例子是扁平化列表,在第一种情况下它是标识函数,在第二种情况下它是concat的递归应用.

C. *_*ann 8

由于一个非常简单的原因,没有办法直接这样做 - 实例选择仅查看"头部",即后面的部分=>.您在上下文中没有放置任何内容 - =>可以影响选择哪个实例的部分.

对于简单的情况,您通常可以完全避免该问题,例如,如果存在有限数量的"基本案例"类型.一个常见的例子就是类型级列表,你有一个递归的情况Cons和一个基本情况Nil,就是这样.

在一般情况下,您通常需要某种"条件测试"类型类,根据是否满足某些条件来选择类型,然后将实际实现交给"辅助"类,该类将条件的结果值作为参数并使用它来选择实例.

  • 嗯,最诚实的答案是我不会.如果不打破多态输入就没有办法做到这一点,而且在我看来,它没有用来证明麻烦的合理性.也就是说,对于展平列表,我认为您可以依靠重叠实例来在递归与基本情况之间进行选择.你在这里使用`OverlappingInstances`吗?你可能会以这种或那种方式需要它. (7认同)
  • 为什么要使用通用列表展平功能?它很少有用. (3认同)

Dav*_*ani 5

这是一个flatten函数实现,适用于任何级别的嵌套列表.我不会真的推荐使用它 - 这里只是为了演示如何在haskell中实现这样的功能.

  • 使用IncoherentInstances是一个麻烦的邀请. (5认同)