2016-09-15 75 views
1

我有以下問題:我定義了一個類的類,並且想要聲明這個類的元組也是實例。但我不知道如何讓GHC接受這個聲明。這裏一個很簡單的例子:如何使組件屬於一個類型的一個實例

class Test a where 
    elm :: a 

而且知道元組我想要做這樣的事情

instance (Test a, Test b) => Test (a,b) where 
    elm = (elm, elm) :: (a,b) 

(其實,我想要做的對應於矢量空間更看中的類型類類似的東西。)

這怎麼辦?在此先感謝您的任何建議!

+3

刪除'::(a,b)'。 –

+0

謝謝!有用!我雖然一直在嘗試它沒有類型註釋... – dmw64

回答

8

試試這個:

instance (Test a, Test b) => Test (a,b) where 
    elm = (elm, elm) 

這應該工作。與你代碼有關的問題是,你添加的:: (a,b)類型註釋實際上是混淆GHC而不是幫助它。問題是,當GHC看到ab它認爲它們代表一些任意類型。但是你不希望它們是任意的,你希望它們在上面的行中引用完全相同的類型。但GHC不知道。如果您將類型註釋留下,GHC將自行確定正確的類型。或者,你可以通過在你的文件的頂部添加下面通過啓用ScopedTypeVariables語言擴展,改變GHC的行爲:

{-# LANGUAGE ScopedTypeVariables #-} 

這將告訴GHC,每當有一個class定義,在引用類型變量頂線,將在其餘的定義範圍內。我是那些認爲ScopedTypeVariables應該默認開啓的人之一,但不幸的是,事實並非如此,主要是因爲兼容性的原因。事實上,這個問題提供了一個很好的論點,爲什麼ScopedTypeVariables默認關閉是違反直覺的。

+0

謝謝!有用!我雖然一直在嘗試它沒有類型註釋... – dmw64

相關問題