You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:22:23