Num class instanceとShow class instanceがあります。整数を受け取って有理数に変換する「 fromInteger 」と「 show」関数も再定義しました。
これはすべてのコードです:
data Racional = Rac Integer Integer
instance Show Racional where
show (Rac numerador denominador) = show numerador ++ "/" ++ show denominador
instance Num Racional where
(*) (Rac numA denA) (Rac numB denB) = multRac (Rac numA denA) (Rac numB denB)
(+) (Rac numA denA) (Rac numB denB) = sumRac (Rac numA denA) (Rac numB denB)
(-) (Rac numA denA) (Rac numB denB) = resRac (Rac numA denA) (Rac numB denB)
abs (Rac numerador denominador) = Rac (abs numerador) (abs denominador)
signum (Rac numerador denominador) = if numerador < 0 || denominador < 0
then (-1) else 1
negate (Rac numerador denominador) = Rac (numerador * (-1)) denominador
fromInteger entero = Rac entero 1
simplificaRac :: Racional -> Racional
simplificaRac (Rac numerador denominador) = if (numerador < 0) && (denominador < 0)
then Rac (abs (div numerador mcd)) (abs (div denominador mcd))
else Rac (div numerador mcd) (div denominador mcd)
where mcd = gcd numerador denominador
multRac :: Racional -> Racional -> Racional
multRac (Rac numA denA) (Rac numB denB) = simplificaRac (Rac (numA * numB) (denA * denB))
divRac :: Racional -> Racional -> Racional
divRac (Rac numA denA) (Rac numB denB) = simplificaRac (Rac (numA * denB) (denA* numB))
sumRac :: Racional -> Racional -> Racional
sumRac (Rac numA denA) (Rac numB denB) = simplificaRac (Rac ((numA * denB) + (denA * numB)) (denA* denB) )
resRac :: Racional -> Racional -> Racional
resRac (Rac numA denA) (Rac numB denB) = simplificaRac (Rac ((numA * denB) - (denA * numB)) (denA* denB) )
「fromInteger 4」を実行すると、show 関数が分母 1 なしで結果を表示する理由がわかりません。つまり、「4/1」と表示したいのですが、「4」と表示されてしまいます。
data Racional = Rac Integer Integer
instance Show Racional where
show (Rac numerador denominador) = show numerador ++ "/" ++ show denominador
instance Num Racional where
(*) (Rac numA denA) (Rac numB denB) = multRac (Rac numA denA) (Rac numB denB)
(+) (Rac numA denA) (Rac numB denB) = sumRac (Rac numA denA) (Rac numB denB)
(-) (Rac numA denA) (Rac numB denB) = resRac (Rac numA denA) (Rac numB denB)
abs (Rac numerador denominador) = Rac (abs numerador) (abs denominador)
signum (Rac numerador denominador) = if numerador < 0 || denominador < 0
then (-1) else 1
negate (Rac numerador denominador) = Rac (numerador * (-1)) denominador
fromInteger entero = Rac entero 1
ありがとうございました :)