Ir para o conteúdo
Polmax

duvida rapida, INT,FLOAT

Mensagens Recomendadas

Baderous    31
Baderous

horas =(Int,Int)

convertMH ::Horas->Float

convertMH (h,m)=(m/60)+h

diz-me que o resultado é um int. o resultado não é um float?

Não, é um Fractional. Comenta o tipo que colocaste, compila, e depois faz ":t convertMH" no GHCi e vais ver.

Como estás a passar 2 Ints e, de seguida, usas a operação (/) sobre eles, operação essa que apenas está definida para instâncias de Fractional (e o tipo Int não é instância de Fractional), o compilador queixa-se:

Prelude> let x = 5 :: Int
Prelude> let y = 6 :: Int
Prelude> :t (x/y)

<interactive>:1:1:
    No instance for (Fractional Int)
      arising from a use of `/' at <interactive>:1:1-3
    Possible fix: add an instance declaration for (Fractional Int)
    In the expression: (x / y)

Para que o resultado fosse um Float, tinhas que forçar a que ambos os elementos do par (h,m) fossem um Float ou Double (as 2 instâncias predefinidas de Fractional):

Prelude> :i Fractional
class (Num a) => Fractional a where
  (/) :: a -> a -> a
  recip :: a -> a
  fromRational :: Rational -> a
  	-- Defined in GHC.Real
instance Fractional Float -- Defined in GHC.Float
instance Fractional Double -- Defined in GHC.Float

Prelude> let x = 4.5
Prelude> :t x
x :: Double
Prelude> let y = 6.6
Prelude> :t y
y :: Double
Prelude> :t (x/y)
(x/y) :: Double
Prelude> x/y
0.6818181818181819

Prelude> let x = 4.5 :: Float
Prelude> :t x
x :: Float
Prelude> let y = 6.6 :: Float
Prelude> :t y
y :: Float
Prelude> :t (x/y)
(x/y) :: Float
Prelude> x/y
0.6818182

Se te perguntares porque é que quando testas 5/6 o GHCi não dá erro, é porque ele assume que os 2 argumentos são Num (e não Int, como se calhar esperavas):

Prelude> :t 5
5 :: (Num t) => t
Prelude> 5/6
0.8333333333333334
Prelude> :t (5/6)
(5/6) :: (Fractional t) => t

Como Num é superclasse de Fractional, não há problema.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Polmax    0
Polmax

então se eu quiser dividir dois inteiros como faço ?

neste caso de horas que tenho (Int,Int) como faria pra fazer alguma divisão entre eles?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade