我試圖填補孔下面的代碼片段用於推斷約束雙方,如果其他類型的平等
import Data.Proxy
import GHC.TypeLits
import Data.Type.Equality
import Data.Type.Bool
import Unsafe.Coerce
ifThenElse :: forall (a :: Nat) (b :: Nat) x l r.
(KnownNat a, KnownNat b, x ~ If (a==b) l r) =>
Proxy a -> Proxy b -> Either (x :~: l) (x :~: r)
ifThenElse pa pb = case sameNat pa pb of
Just Refl -> Left Refl
Nothing -> Right $ unsafeCoerce Refl -- This was the hole
是否有可能和?
編輯:檢查了sameNat
的來源,結果證明他們使用unsafeCoerce
。我相應地編輯了上面的代碼。
您應該發佈您的編輯作爲答案(並回滾編輯)。 – Alec
一般問題似乎是,儘管GADT模式匹配提供了等式約束,但它從不提供不等式約束,所以我們不能說服GHC不使用封閉類型族的第一個子句。我們可能需要GHC的更多支持來做到這一點,AFAICS。 – chi
呃,你可以通過查看這種不容易證明的類型來判斷,即使有一個歸納的「Nat」(而不是'GHC.TypeLits'中的破壞的類型)。你是如何設法將自己融入這個特殊的角落的?我們可能會告訴你如何重新設計你的程序,這樣你就不需要這樣粗糙的證明。 –