2011-07-23 10 views

Respuesta

7

No se puede ir (sanamente) Num-Num, como Num proporciona ningún mecanismo para extraer información sobre el valor contenido distinto de su falsa ecuación y exposición de maquinaria, pero si usted está dispuesto a asumir un poco más en el nombre del número de donde vienes, entonces puedes tener recurso.

En particular

fromIntegral :: (Integral a, Num b) => a -> b 

y la composición de

toRational :: Real a => a -> Rational 

con

fromRational :: Fractional a => Rational -> a 

son buenos candidatos para hacer lo que quiere decir, si no exactamente lo que pidieron.

Mientras read . show está bien escrito y tiene la firma que usted propone, el significado es gobbledigook.No hay nada en absoluto que diga que el texto emitido por una instancia Show será compatible con una instancia Read completamente diferente, y hay muchos ejemplos de contador.

El contrato (implícito) en Read y Show solo se aplica cuando los usa con el mismo tipo.

7

No hay buenas maneras. Algunos números contienen más información que otros, así que ¿cómo se puede esperar convertir dos números arbitrarios de una buena manera? Algunos ejemplos simples: ¿cómo se convierte un doble en un int? Un Rational a en Int8? Un complejo doble a un flotador?

Todo esto implica la pérdida de información y, a continuación, no hay una forma obvia correcta.


Y como dice @hammar, las operaciones en Num simplemente no permiten construir una función de este tipo.

0

La buena manera es hacer un tipo específico de conversión, como ronda o abrazadera. Tal función hace lo que dice que hace.

3

No se puede escribir ninguna función útil del tipo (Num a, Num b) => a -> b. Como a y b son variables de tipo, las únicas operaciones útiles que podemos usar en ellas son las de la clase Num. (Eq y Show no nos ayudarán mucho aquí).

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

La única función aquí que le permite hacer una b si no tiene uno para empezar es fromInteger, pero no hay manera de convertir en un aInteger, por lo que las únicas funciones que se pueden escribir de este tipo devuelve fromInteger de alguna constante, o inferior. No es muy útil.


Como augustss pointed out, no hay manera obvia de hacer esta conversión de todos modos. Recuerde que muchos tipos pueden ser Num. No solo los diferentes tipos de números reales, sino también números complejos, matrices, polinomios, etc. No existe una conversión significativa que funcione entre todos.

Cuestiones relacionadas