3

私はタイプを持っています

class IntegerAsType a where
  value :: a -> Integer

data T5
instance IntegerAsType T5 where value _ = 5

newtype (Num a, IntegerAsType n) => PolyRing a n = PolyRing [a]

私の主な質問は、特定の変数をどのように定義するPolyRingかです。

次のようになります。

x = [1, 2, 3] :: Integer T5

(私は思う)問題は:?の後の正しい構文は何::ですか?

エラーが発生します

Couldn't match expected type `PolyRing Integer T5'
         with actual type `[t0]'
In the expression: [1, 2, 3] :: PolyRing Integer T5
In an equation for `x': x = [1, 2, 3] :: PolyRing Integer T5

また、これを実装するためのより良い方法を探しています。特に、aリスト要素のタイプからタイプを推測するIntegerAsType n必要がありますが、指定する必要があります(可能な場合でも、リストの長さに依存しないようにする必要があります)。

私がこれまでに試したこと:

x = [1,2,3] :: PolyRing (Integer, T5)

x = [1,2,3] :: PolyRing Integer T5
4

2 に答える 2

2

Anewtypeは単なる同義語ではなく、タイプレベルで異なるタイプを作成する方法です(後で同じですが)。つまり、データコンストラクターを使用して明示的にラップする必要があります。また、コンテキストは効果がありません。あなたはまだどこでもそれをタイプしなければなりません。

于 2011-09-02T20:39:31.937 に答える
2

最初の注意

次のようなデータ型コンテキスト:

newtype (Num a, IntegerAsType n) => PolyRing a n = PolyRing [a]

一般的に悪い考えであり、言語から引退しました。

それを無視する

インスタンスを構築するには、データコンストラクターを使用する必要がありますPolyRing

PolyRing [1,2,3]

しかし、それだけでは十分ではありません。これまでの型推論はです(IntegerAsType n) => PolyRing Integer n。最終的な型署名はこれを完成させlet x = PolyRing [1,2,3] :: PolyRing Integer T5ます。

最初のメモに戻る

それでも、おそらくあなたは望んでいた:

newtype PolyRing a n = PolyRing [a]

また、ポリリングを構築または消費するすべての関数は、必要な制約を適用できます。

func :: (Num a, IntegerAsType n) => PolyRing a n -> ...
于 2011-09-02T20:40:38.200 に答える