处理IO动作

时间:2016-03-01 08:23:49

标签: haskell monads

我是一名哈斯克尔初学者,并且陷入了IO动作行为。

main() :: IO()
  retval = if something
             then "foo"
             else `return value of IO String action` i.e getLine
  print retval

如何使此代码有效?

2 个答案:

答案 0 :(得分:2)

if的两个分支都必须具有相同的类型。由于"foo"Stringelse部分也必须是String(但不是IO String)。

你可以做到

retval = if something
           then return "foo"
           else getLine

为了制作ifIO String的所有部分。在此处,return会将字符串"foo"转换为仅返回IO的{​​{1}}操作。

然后,您需要从"foo"中提取String,因为IO String需要一个字符串(即您执行print操作):

IO

答案 1 :(得分:1)

中的 then else 值如果需要具有相同的类型。您需要将 String 转换为 IO String





return 函数将执行这适合你。




  main :: IO()
 main = do
 retval<  - 如果有什么
然后返回“foo”
其他getLine
 print retval
  




请注意,因为这是类型IO a,您还需要使用“< - ”分配retVal的值,而不是 let .. = ..