Vous devez lire plus sur comment fonctionne Haskell IO et vous assurer de le comprendre.
Quelques points sur votre exemple. Si vous souhaitez utiliser read
pour désérialiser à SomeData
, vous devez fournir une instance Read
pour le type. Vous pouvez utiliser la valeur par défaut un:
data SomeData = SomeData Int Int deriving (Read)
Deuxièmement: getLine
est une action IO
qui retourne une String
, pas un String
; puisque read
veut un String
, c'est la cause de votre erreur. Ceci est plus proche de ce que vous voulez:
getDataFromUser :: IO SomeData
getDataFromUser = do str <- getLine
return (read str)
Cela peut être simplifié à ce qui suit, mais assurez-vous de comprendre l'exemple ci-dessus avant vous vous inquiétez trop à ce sujet:
getDataFromUser :: IO SomeData
getDataFromUser = liftM read getLine
Les réponses ci-dessous sont " plus utile "dans le sens où ils répondent au problème conceptuel que vous avez; Cependant, vous pouvez également être intéressé par le correctif "moins utile", 'getDataFromUser :: IO SomeData; getDataFromUser = readLn'. –