我试图以归纳方式定义一对类实例.那是:
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的递归应用.
由于一个非常简单的原因,没有办法直接这样做 - 实例选择仅查看"头部",即后面的部分=>.您在上下文中没有放置任何内容 - =>可以影响选择哪个实例的部分.
对于简单的情况,您通常可以完全避免该问题,例如,如果存在有限数量的"基本案例"类型.一个常见的例子就是类型级列表,你有一个递归的情况Cons和一个基本情况Nil,就是这样.
在一般情况下,您通常需要某种"条件测试"类型类,根据是否满足某些条件来选择类型,然后将实际实现交给"辅助"类,该类将条件的结果值作为参数并使用它来选择实例.
这是一个flatten函数的实现,适用于任何级别的嵌套列表.我不会真的推荐使用它 - 这里只是为了演示如何在haskell中实现这样的功能.
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |