read
se define en el preludio comoHaskell: leído y tipo firmas
read :: (Read a) => String -> a
y pueden ser utilizados como por ejemplo, read "1" :: Int
.
ahora una función
readOne :: (Read a) => [String] -> (a, [String])
readOne (x:xs) = (read x,xs)
utilizado con readOne ["1","foo"]
resultados (como se esperaba) en el error
Ambiguous type variable 'a' in the constraint:
'Read a' arising from a use of 'readOne' at :1:0-18
Probable fix: add a type signature that fixes these type variable(s)
Pero readOne ["1","foo"] :: Int
no funciona, mientras que
readOneInt :: [String] -> (Int, [String])
readOneInt = readOne
obras muy bien:
> readOneInt ["1", "foo"]
(1,["foo"])
Así que: ¿cómo puedo agregar una firma de tipo de readOne
sin definir una nueva función como readOneInt
?
¡Muchas gracias! –
¡Cuidado! El ejemplo al final solo funcionará en ghci porque el tipo de 1 está predeterminado en 'Entero '. Si le preguntas a ghci por el tipo de expresión (a través de ': t'), obtienes' (Num a, Read a) => (a, [String]) 'que tiene el mismo problema que antes. 'asTypeOf' puede ayudar aquí, como en' asTypeOf (readOne ["1", "foo"]) (0 :: Double, [] :: [String]) '- que normalmente escribiría con asTypeOf en backticks pero SO no le gusta los backticks doblemente escapados. – yatima2975