处理IO动作

Dealing with IO action

我是一个 haskell 初学者并且被 IO 动作行为困住了。

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

我怎样才能让这段代码工作?

thenelse 中的值 if 需要具有相同的类型。您需要将 String 转换为 IO String.

return 函数将为您执行此操作。

main:: IO()
main = do
    retval <- if something
                 then return "foo"
                 else getLine
     print retval

注意,因为this是IO a类型的,所以retVal的赋值也需要使用“<-”,而不是let .. = ..

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

你可以做到

retval = if something
           then return "foo"
           else getLine

为了使 if 的所有部分成为 IO String 类型。这里,return 将字符串 "foo" 转换为一个 IO 动作,它只是 returns "foo".

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

retval <- if something
            then return "foo"
            else getLine