的獲得I型有型哈斯克爾代數參數
class IntegerAsType a where
value :: a -> Integer
data T5
instance IntegerAsType T5 where value _ = 5
newtype (IntegerAsType q) => Zq q = Zq Integer deriving (Eq)
newtype (Num a, IntegerAsType n) => PolyRing a n = PolyRing [a]
我試圖做的PolyRing型一個不錯的「秀」。特別是,我想讓「秀」打印出型號'a'。是否有一個函數返回代數參數的類型(類型爲'show')?
我試圖做的另一種方式是使用模式匹配,但我遇到了內置類型和代數類型的問題。
我想爲Integer,Int和Zq q中的每一個獲得不同的結果。 (例如玩具:)
test :: (Num a, IntegerAsType q) => a -> a
(Int x) = x+1
(Integer x) = x+2
(Zq x) = x+3
這裏有至少兩個不同的問題。
1)Int和Integer不是'Int'和'Integer'類型的數據構造函數。是否有這些類型的數據構造函數/如何模式匹配?
2)雖然在我的代碼中沒有顯示,但Zq是Num的一個實例。我得到的問題是:
Ambiguous constraint `IntegerAsType q'
At least one of the forall'd type variables mentioned by the constraint
must be reachable from the type after the '=>'
In the type signature for `test':
test :: (Num a, IntegerAsType q) => a -> a
我有點看到它爲什麼抱怨,但我不知道如何解決這個問題。
感謝
編輯: 的什麼,我試圖與測試功能做一個更好的例子:
test :: (Num a) => a -> a
test (Integer x) = x+2
test (Int x) = x+1
test (Zq x) = x
即使我們忽略了一個事實,我不能構建整數和INTS這種方式(仍想知道如何!),這種「測試」並沒有編譯,因爲:
Could not deduce (a ~ Zq t0) from the context (Num a)
我的下一次嘗試在此功能與類型簽名:
test :: (Num a, IntegerAsType q) => a -> a
從而導致新的錯誤
Ambiguous constraint `IntegerAsType q'
At least one of the forall'd type variables mentioned by the constraint
must be reachable from the type after the '=>'
我希望這是我的問題更清楚一點....
hammar回答了我的問題的第一部分。不過,我仍然對如何進行模式匹配感興趣。你可以在Int和Integer模式匹配嗎? – crockeea
我欣賞這個警告,並意識到我可能正在挖一個洞... 讓我試着給一個函數的更好的例子,我可能實際上需要我所要求的: test::(Num a)=> a - > a test(Int x)= x + 2 test (Zq x)的類型參數,所以我可以修改,如果我需要。更重要的是,它不會編譯(即使我拿出不可構造的Int和Integer行)。隨着類型簽名給定的,我得到的錯誤:從上下文(民一) 無法推斷(一〜ZQ T0) – crockeea
似乎有在這裏是一些誤解關於類型。給我幾分鐘,我會更新我的答案,討論我能做些什麼。 –