2017-07-25 57 views
2

我有一種感覺,這是不可能的,但會喜歡一些輸入,看看是否有一些擴展或技術我失蹤。是否可以組合類型類的實例?

我有一個定義了一些默認的方法類型類的泛型實例:

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,但問題是,對於TestClassSpecificType比如沒有實現bar。我只想聲明第二個實例的一部分,並對其餘部分使用默認實現。有沒有辦法做到這一點?

回答

6

在Haskell 98,你可以把default implementationsclass定義

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

現在所有instance S其中不實現foobar自己,它會採取默認的實現。

+0

還有其他的方法來結合實例嗎?無可否認,我的用例比我提出的要複雜得多。例如,如果默認實例還需要「Show」呢? ('instance Show a => TestClass a where ...' – jkeuhlen

+0

@jkeuhlen好,然後問一個更具體的問題。 – leftaroundabout

+0

@leftaroundabout:我可能會這樣做,但我也從這個答案中學到了一些東西,這對問題很有幫助。問,所以我不只是要編輯我現在的問題,或者要求一個新的沒有第一個跟隨在這裏。 – jkeuhlen

相關問題