我有一堆可以在Vectors上工作的函數,即具有強制類型長度的列表。聲明參數化類型同義詞的實例
我試圖讓我的類型更容易編寫,即而不是寫
foo :: (Fold Integer v, Map Integer Integer v v, ...) => ...
我聲明瞭一個新的類NList
這樣我就可以寫foo :: NList v Integer => ...
(簡化)班看起來是這樣的:
class (Fold (v i) i
, Map i i (v i) (v i)
, Map i (Maybe i) (v i) (v (Maybe i))
) => NList v i
正如你所看到的,我必須保持「載體」類型從「項目」分離式(即v
與i
分開),這樣我就可以將Map
這樣的東西寫到Maybe
載體上。
因此,v
必須有種類* -> *
和i
種類*
。
然而,當我嘗試用向量初始化它,像這樣:
instance NList Vec2 Integer
instance NList Vec3 Integer
...
我得到以下錯誤:
Type synonym `Vec2' should have 1 argument, but has been given none
In the instance declaration for `NList Vec2 Integer'
現在,我很新的輸入級編程,我知道我很可能以非常落後的方式來做這件事。是否有可能像這樣實例化一個類型的同義詞?是否有任何類型嚮導有更好的方法來實現我的目標的建議?
非常酷,謝謝。我沒有得到的是最後一個例子。怎麼了蒂爾達運營商? – So8res 2012-02-15 15:05:16
這是[平等約束](http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/equality-constraints.html)。如果你在範圍內有一個'Num a'約束,你可以對'a'類型的值使用算術運算符;如果你在範圍內有一個'(a〜b)'約束,你可以使用'a'值作爲'b'值,反之亦然。基本上,你可以讀'(n〜Z)=> r'爲「向我證明'n''是'Z',我給你一個'r''。 – ehird 2012-02-15 15:23:01