1

モノのいくつかのバージョンを定義したいのですが、プログラムのタイプの安全性を高めるためにタイプが異なります。たとえば、インスタンスにしたい2変量値のタイプがいくつかありますがNum、すべて異なるタイプである必要があります。つまり、私が行ったことは、1つの型変数を使用して新しい型を作成し、それに基づいて新しい型を宣言することです。ただし、両方のコンストラクターを常に使用する必要があるのは少し面倒です。これを回避する方法はありますか?

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype Bivar t = Bivar (t,t) deriving (Show, Eq)

instance (Num t) => Num (Bivar t) where 
  (+) (Bivar (x1,y1)) (Bivar (x2,y2)) = Bivar (x1+x2, y1+y2)
  (-) (Bivar (x1,y1)) (Bivar (x2,y2)) = Bivar (x1-x2, y1-y2)
  (*) (Bivar (x1,y1)) (Bivar (x2,y2)) = Bivar (x1*x2, y1*y2)
  abs (Bivar (x1,y1)) = Bivar (abs x1, abs y1)
  fromInteger i = Bivar (fromInteger i, fromInteger i)
  signum (Bivar (x1,y1)) = Bivar (signum x1, signum y1)

newtype BivarNode = BivarNode (Bivar Int) deriving (Show, Eq, Num)
newtype BivarVal = BivarVal (Bivar Double) deriving (Show, Eq, Num)
newtype HBivarVal = HBivarVal (Bivar Double) deriving (Show, Eq, Num)

-- This is annoying:
a1 = BivarVal (Bivar (1.0, 2.0))
a2 = HBivarVal (Bivar (1.0, 2.0))
b = BivarNode (Bivar (1,2))

-- is there a way so that I can write it this way?
aa1 = BivarVal (1.0, 2.0)
aa2 = HBivarVal (1.0, 2.0)
bb = BivarNode (1,2)

ありがとう!

編集:

元の質問を拡張するために、パターンの一致にタイプ名を使用したいと思います。

myFunction :: HBivarVal -> Double
myFunction (HBivarVal (Bivar (x,y))) = x 

それも可能ですか?

4

2 に答える 2

2

それらをすべてニュータイプにしないのはなぜBivarですか?

instance (Num a, Num b) => Num (a, b) where
    (a, b) + (a', b') = (a+a', b+b')
    (a, b) * (a', b') = (a*a', b*b')
    (a, b) - (a', b') = (a-a', b-b')
    fromInteger i = (fromInteger i, fromInteger i)
    abs    (a, b) = (abs    a, abs    b)
    signum (a, b) = (signum a, signum b)

newtype Bivar t   = Bivar     (t     , t     ) deriving (Show, Eq, Num)
newtype BivarNode = BivarNode (Int   , Int   ) deriving (Show, Eq, Num)
newtype BivarVal  = BivarVal  (Double, Double) deriving (Show, Eq, Num)
newtype HBivarVal = HBivarVal (Double, Double) deriving (Show, Eq, Num)
于 2012-04-29T02:03:35.793 に答える
1

はい、ヘルパー関数を定義できます。

bivarVal = BivarVal . Bivar
hBivarVal = HBivarVal . Bivar
bivarNode = BivarNode . Bivar
于 2012-04-28T12:48:01.740 に答える