【问题标题】:Is there a way of receiving IO outside of main in Haskell?有没有办法在 Haskell 的 main 之外接收 IO?
【发布时间】:2019-10-14 22:13:36
【问题描述】:

这可能是一个愚蠢的问题,但是当我尝试在 main 函数之外获取输入时出现错误:

menu2Players :: String -> String -> (String, String)
menu2Players player1 player2 = do
    putStrLn("Qual o nome do primeiro jogador?\n")
    player1 <- getLine
    putStrLn("Qual o nome do segundo jogador?\n")
    player2 <- getLine
    return (player1, player2)

我得到的错误

IO 动作“main”未在模块“Main”中定义

我能做些什么来解决这个问题?

【问题讨论】:

  • 你的函数实际上返回了一个IO (String, String)类型的值,所以你的类型签名会导致错误。缺少main 是一个完全独立的问题,但是如果您尝试实际编译文件而不是将其加载到 GHCi 中,则它需要具有main 值。
  • 程序有一个main但是我想把这个函数返回给另一个函数
  • 嗯,这应该不是问题。不过,它必须是IO 类型的函数(或action)。
  • 您发布的代码与出现的错误无关。
  • return 在 Haskell 中与您在其他语言中会发现的 return 不同。它是一个函数,而不是关键字,因此对控制流没有影响。 Quick demonstration

标签: haskell io main io-monad do-notation


【解决方案1】:

在Haskell中,如果要在函数中做IO,需要返回IO

menu2Players :: String -> String -> IO (String, String)
menu2Players player1 player2 = do
    putStrLn "Qual o nome do primeiro jogador?\n"
    player1 <- getLine
    putStrLn "Qual o nome do segundo jogador?\n"
    player2 <- getLine
    return (player1, player2)

为什么需要返回IO的细节有点棘手,但你可以在这里了解它:http://learnyouahaskell.com/input-and-output

【讨论】:

    【解决方案2】:

    (有点晚了,但是...)有效的代码,我只需要 IO 返回。

    menu2Players = do
        putStrLn "Qual o nome do primeiro jogador?\n"
        player1 <- getLine
        putStrLn "Qual o nome do segundo jogador?\n"
        player2 <- getLine
        return (player1, player2)
    

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 1970-01-01
      • 2017-10-25
      • 2018-12-19
      • 2021-09-10
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多