私は、ベクトルに作用する一連の関数、つまりタイプ強制長のリストを持っています。私は、私はちょうどfoo :: NList v Integer => ...
パラメータ化された型の同義語のインスタンスを宣言する
(簡体字)クラスを書くことができます書くことが簡単に自分の型を作ることを試み、すなわちの代わりに、私は新しいクラスNList
を宣言してい
foo :: (Fold Integer v, Map Integer Integer v v, ...) => ...
を書いて
あなたが見ることができるように、私は(「アイテム」タイプとは別の「ベクター」タイプを維持する必要があり
class (Fold (v i) i
, Map i i (v i) (v i)
, Map i (Maybe i) (v i) (v (Maybe i))
) => NList v i
すなわち:次のようになります私がMap
のようなことをMaybe
ベクター上に行うことができるように、私はから別のをi
と分離しています。
このように、v
は* -> *
、である必要があります。
しかし、私はそうのようなベクターを用いて、それをインスタンス化しようとすると:
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'
が、私はプログラミングレベル型に非常に新しいです、私はこれを非常に後方に行っている可能性が高いことを理解しています。このような型同義語をインスタンス化することは可能ですか?どのタイプ・ウィザードにも、私の目標を達成するためのより良い方法の提案がありますか?
非常にありがとう、ありがとう。私が得られない1つの事は、最後の例です。ティルダのオペレータはどうですか? – So8res
これは[等価制約](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であることを証明してください」と読むことができます。 – ehird