假設我有以下類:哈斯克爾繼承類型類
class P a where
nameOf :: a -> String
我想聲明的是這個類的所有實例都自動的Show
實例。我第一次嘗試將是如下:
instance P a => Show a where
show = nameOf
我第一次走這條路昨天導致語言擴展的養兔場的嘗試:我是第一次告知要靈活的情況下切換,那麼不可判定的情況下,則可以重疊的情況下,最後得到一個關於重疊實例聲明的錯誤。我放棄了,然後回到重複的代碼。然而,這從根本上看似乎是一個非常簡單的需求,而且應該很容易滿足。
於是,兩個問題:
- 有一個平凡簡單的方法來做到這一點,我剛剛錯過?
- 爲什麼我會遇到重疊實例問題?我可以明白爲什麼我可能需要
UndecidableInstances
,因爲我似乎違反了Paterson條件,但是在這裏沒有重疊的情況:甚至沒有P
的實例。爲什麼typechecker認爲有多個實例Show Double
(在這個玩具的例子中似乎是這種情況)?
重疊(和重載分辨率)僅由實例頭部'Show a'確定,所以它確實與其他每個Show實例重疊。 – augustss 2013-04-04 10:03:23
假設你聲明瞭'P Int'的實例,並且你已經有了'Show Int'的實例,所以這將導致Show的重疊實例。 – Satvik 2013-04-04 10:06:09
@Satvik當然,除了我沒有'P Int'的實例。如果我試圖創建一個'P Int',我會期待一個錯誤,但不是僅僅聲明它可能存在。 – Impredicative 2013-04-04 10:14:13