是否可以组合类型类的实例?

时间:2017-07-25 15:37:25

标签: haskell

我有一种感觉这是不可能的,但我会喜欢一些输入,看看是否有一些我缺少的扩展或技术。

我有一个类型类的通用实例,它定义了一些默认方法:

class TestClass a where 
  foo :: a -> Maybe Text 
  bar :: a -> [Int]

instance TestClass a where 
  foo _ = Nothing 
  bar _ = []

data SpecificType = SomeValue | OtherValue

instance TestClass SpecificType where 
  foo SomeValue = Just "Success"
  foo OtherValue = Just "Other Success"

我认为这已经需要OverlappingInstances,但问题是TestClass的{​​{1}}实例未实现SpecificType。我只想声明第二个实例的一部分,并使用其余的默认实现。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:6)

在Haskell 98中,您可以default implementations放入class定义

class TestClass a where
    foo :: a -> Maybe Text 
    foo _ = Nothing  -- default implementation
    bar :: a -> [Int]
    bar _ = []       -- default implementation

现在,对于您自己未实现instancefoo的所有bar,它将采用默认实现。