estoy usando esta aplicación de maybeRead
:Haskell: leer un número (entero o punto flotante)
maybeRead :: (Read a) => String -> Maybe a
maybeRead = fmap fst . listToMaybe . filter (null . dropWhile isSpace . snd) . reads
y mi propia función getNum
que impulsa hasta que se pone de entrada válida:
getNum :: (Num a, Read a) => String -> IO a
getNum s = do
putStr s
input <- fmap maybeRead getLine
if isNothing input
then getNum s
else return $ fromJust input
Sin embargo si ingreso 5.2
, lo trata como una entrada incorrecta: ¿por qué? No hay ocurrencias de Int
y Integer
en mi código. Solo estoy usando Num
, ya que quiero aceptar cualquier tipo de número.
Si lo llamo explícitamente como getNum "Enter a number: " :: IO Double
, entonces funciona. ¿Tengo que hacer esto? ¿El sistema de tipos de Haskell me está engañando para que piense que debería ser capaz de hacer esto cuando en realidad es imposible sin una escritura dinámica completa? Si es así, ¿por qué mi código incluso compila? ¿Por qué asume enteros?
Nota estilística pequeña: es mejor utilizar la coincidencia de patrones que 'isNothing' y' fromJust', por lo que la expresión 'if' puede reemplazarse con' case input of Nothing -> getNum s; Solo x -> devolver x'. – hammar
Gracias, eso se ve mucho mejor. – mk12