【问题标题】:Writing an IO String to stdout in Haskell在 Haskell 中将 IO 字符串写入标准输出
【发布时间】:2011-12-20 16:24:40
【问题描述】:

我们如何打印一个将 IO 字符串返回到标准输出的函数的输出?我无法使用 show 或 print。

【问题讨论】:

    标签: haskell io stdout


    【解决方案1】:

    如果你想打印函数foo :: Int -> IO String的结果(例如),你可以这样做

    main = do
        str <- foo 12
        putStrLn str
    

    或者,没有do-notation,

    main = foo 12 >>= putStrLn.
    

    do-notation 是第二个的语法糖,它使用基本的(&gt;&gt;=) 组合子,其类型为

    (>>=) :: Monad m => m a -> (a -> m b) -> m b
    

    IOMonad 类的一个实例,所以你可以在这里使用它。

    foo :: Int -> IO String
    foo 12 :: IO String
    
    putStrLn :: String -> IO ()
    
    (foo 12) >>= putStrLn :: IO ()
    

    【讨论】:

    • 一般来说,你可以说'printio = do oi
    【解决方案2】:

    我们如何打印一个将 IO 字符串返回到标准输出的函数的输出?

    好吧,让我们看看。这是一个返回 IO 字符串的函数:

    dumbFunction :: a -> IO String
    dumbFunction x = getLine
    

    dumbFunction 是一个哑函数(但仍然是一个函数!)。它忽略其输入,然后返回getLine,其类型为IO String

    所以你告诉我,你如何打印getLine :: IO String?答案是,你没有!这就是我们所说的“IO 动作”。请注意,IO 操作不是一个函数,因为它确实接受输入。 (但是,IO 操作可能会像 getLine 那样从读取标准输入等 IO 操作获取输入。但它不被视为“函数”,因为它不接受任何传统输入)

    因此,您可能希望运行该动作,然后打印结果,而不是打印出动作本身。这可以按照 Daniel Fischer 的描述来完成(使用 &lt;-,可以将其视为“运行”运算符)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多