我在他们的维基上阅读了关于Haskell中IO单子更深层次的工作原理,并遇到了这段代码
main = do a <- ask "What is your name?"
b <- ask "How old are you?"
return ()
ask s = do putStr s
readLn
对我来说这很有道理。ask函数应该打印出给定的字符串并返回可传递到a或b的行。
然而,将其加载到GHCi中时,我遇到了问题。告诉我在使用ask时没有Read的实例,并且我可以导入GHC.Read。那是不必要的。这段代码在Haskell.org上,所以我认为它应该能够工作。是语言中有些东西被更改了还是我缺少某个重要的理解点?
askString :: String -> IO String
,但是askOther :: (Read a) => String -> IO a
(请参考missingnos的优秀答案,了解如何将a
转换为Int
)。您也可以使用askOther
来获取字符串,但是程序用户必须输入"Arash"
而不是简单的Arash
。 - Tarrasch