Haskell新手求助:我的IO操作为何出现类型不匹配错误?
问题分析与修正
你的代码存在三个关键问题:
askStrength的类型签名错误:你定义的类型是
() -> IO Int,但该函数无需接收任何参数,本质是一个IO动作,正确类型应为IO Int。Haskell中无参函数不需要用()标识,直接声明返回的IO类型即可。main中调用askStrength的方式错误:main必须是
IO t类型的动作,但你当前返回的是一个函数() -> IO Int,类型不匹配。只需直接在do块中调用askStrength即可(修正类型后)。readLn的类型标注错误:
readLn的类型是Read a => IO a,它返回的是包裹着值的IO动作,而非直接的Int值。你写的readLn::Int不符合类型要求,正确标注应为readLn :: IO Int,这样<-才能从IO动作中提取出Int值。
修正后的代码
main = do askStrength askStrength :: IO Int askStrength = do putStr "Strength : " strength <- readLn :: IO Int return strength
更简洁的写法
可以省略类型标注(编译器会自动推导),同时return strength可直接替换为readLn,因为readLn本身就返回IO Int:
main = askStrength askStrength = do putStr "Strength : " readLn
内容的提问来源于stack exchange,提问作者Yago
相关产品推荐
相关产品推荐

