0

我有一个Num 类实例和一个Show 类实例。我重新定义了“ 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”然后显示函数显示没有分母 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

谢谢 :)

4

0 回答 0