簡體   English   中英

為什么此實例無法覆蓋條件?

[英]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 = atvsright = b 替換Sa映射到S(a)=(a,a')並且b映射到S(b)=(b,b')

因此,我們在S(tvsright)=S(b)=(b,b')找到類型變量S(tvsright)=S(b)=(b,b')bb' ),它們不出現在S(tvsleft)=S(a)=(a,a') 因此覆蓋條件失敗。

正如@Ben所說,覆蓋條件不考慮上下文:只有實例頭才重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM