2016-07-31 43 views
2

遇到錯誤大致是這樣的:斷言型家庭FORALL平等

Could not deduce T1 p (T2 p a b) ~ (a, b) 

從函數聲明,其中T1T2是類型家庭。

但是,所有的p,ab均相同。

我可以通過添加修復:

T1 p (T2 p a b) ~ (a, b) 

但後來我得到類似如下:

Could not deduce T1 p (T2 p a c) ~ (a, c) 

最後,我可以補充足夠的等式約束的功能,殺死錯誤。

另一種方法是不定義函數簽名,編譯器派生出可怕的東西,但它工作正常。

但是,有沒有辦法,我可以這樣說

forall p a b. T1 p (T2 p a b) ~ (a, b) 

這樣我就可以覆蓋這些都一氣呵成?

+0

順便說一下'T1'和T2'是什麼? – Alec

+0

請添加您正在嘗試執行的完整示例。這個問題是不可回答的。 – dfeuer

+0

「以下的平等是真實的」 - 你怎麼知道這是真的?是否有關向GHC證明的問題,以便您可以省略類型簽名中的類型等式約束? – chi

回答

0

你的困難的最可能的原因是你的發言

[中]平等是適用於所有pab

並不完全正確。你聲稱的平等是

T1 p (T2 p a b) ~ (a, b) 

想我給你

type family P :: k 
type family A :: k 
type family B :: k 

其中沒有家庭的任何實例。請問T1 P (T2 P A B)還減少到(A, B)?如果是這樣,我相信GHC應該在沒有上下文的情況下接受你的功能。如果沒有,你必須通過一些證據。例如,您可以通過證據證明每種類型是或不是某種形式。在模式匹配下,也許有一些額外的幫助,家庭應該減少。