[英]Why does type class coverage condition fail in Haskell but not PureScript
[英]Why does this instance fail the coverage condition?
為什么在沒有UndecidableInstances
的情況下,以下實例聲明會失敗覆蓋條件? 似乎如果在上下文中滿足功能依賴性,則在新實例中滿足它。
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE UndecidableInstances #-}
class Foo a b | a -> b where
instance (Foo a b, Foo a' b') => Foo (a, a') (b, b') where
如果我嘗試使用類型系列復制相同的東西,則沒有問題。
{-# LANGUAGE TypeFamilies #-}
type family Bar a
type instance Bar (a, b) = (Bar a, Bar b)
我相信在選擇實例時實際上並沒有考慮到實例的約束。 它們成為在每個使用站點證明的附加約束,而不是限制實例的適用性。
因此,您的實例聲明instance Foo (a, b) (c, d)
,這顯然不符合覆蓋條件。
添加(Foo ab, Foo a' b')
只會使實例的某些用法導致“沒有此類實例”錯誤,它實際上不會更改您的實例將被選擇的類型。
來自GHC 文檔 :
覆蓋條件。 對於類的每個函數依賴,tvsleft - > tvsright,S中的每個類型變量(tvsright)必須出現在S(tvsleft)中,其中S是將類聲明中的每個類型變量映射到實例中相應類型的替換宣言。
在你的班上你有a -> b
,所以tvsleft = a
和tvsright = b
。 替換S
將a
映射到S(a)=(a,a')
並且b
映射到S(b)=(b,b')
。
因此,我們在S(tvsright)=S(b)=(b,b')
找到類型變量S(tvsright)=S(b)=(b,b')
( b
和b'
),它們不出現在S(tvsleft)=S(a)=(a,a')
。 因此覆蓋條件失敗。
正如@Ben所說,覆蓋條件不考慮上下文:只有實例頭才重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.