1
data Vector a = Vector a a a deriving (Eq, Show)

instance Functor Vector where
    fmap f (Vector x y z) = Vector (f x) (f y) (f z)

ここまでは順調ですね。

instance Num ((Num a) => Vector a) where
    negate = fmap negate

うまくいきません。その最初の行でさまざまなバリエーションを試しましたが、GHC は文句を言い続けます。含む数字を;Vectorインスタンスにしたい。Num確かにこれは可能であるべきですか?そうしないとIntIntegerFloatDouble、 などのインスタンスをすべて同じ定義で作成する必要があります。

4

2 に答える 2

8
instance Num a => Num (Vector a) where
   negate = fmap negate

他のメソッドも書くことを検討してください。

deriving (Eq, Show, Functor)(をオンにすると書き込み可能になります-XDeriveFunctor。)

于 2012-05-18T00:14:08.683 に答える
2

Vectorのインスタンスを作成するのはおそらく悪い考えですNum。の宣言は次のNumとおりです。

class Num a where
  (+) :: a -> a -> a
  (*) :: a -> a -> a
  (-) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a

+とは問題-ありnegateません。*外積として定義できますが、3-ベクトルのみであり、これは実際にそれを拡張しています。abssignumありfromInteger、意味のある定義はありません。

つまり、 に押し込むことは可能VectorですNumが、結果は良くありません。

Numeric preludeなど、標準の Prelude のものを置き換える代替の型クラス階層を調べたい場合があります。

于 2012-05-18T19:09:35.193 に答える