【问题标题】:Haskell print a return value (Yet Another Haskell Tutorial, askForWords)Haskell 打印返回值(又一个 Haskell 教程,askForWords)
【发布时间】:2020-07-07 00:18:26
【问题描述】:

所以我尝试使用编译代码中的返回值将一行文本打印到终端窗口。程序如下所示:

module Main
    where

import System.IO

main = do
  askForWords

askForWords = do
  putStrLn "Pleas enter a word:"
  word <- getLine
  if word == ""
    then return []
    else do
      rest <- askForWords
      return (word ++ " " ++ rest)

当我在 GHCi 中运行它时,它运行良好

*Main> main 
Pleas enter a word:
Hello
Pleas enter a word:
World
Pleas enter a word:

"Hello World "
*Main> 

当我尝试运行 Unix 可执行文件时,程序不打印最后一个字符串

% /Users/tobyone/Workspace/Haskell/yaht/Yaht ; exit;
Pleas enter a word:
Hello
Pleas enter a word:
World
Pleas enter a word:


[Process completed]

我尝试使用 putStrLn 在 main 中打印出 askForWords 但出现错误

<interactive>:2:10: error:
    Couldn't match type ‘IO [Char]’ with ‘[Char]’
    ...
    ...

【问题讨论】:

  • 你是如何尝试使用putStrLn的?看来你做错了,但如果你不表明你的错误,我们不知道如何纠正它。
  • GHCi 有一些魔力。当您编写1+2 时,它实际上运行print (1+2)。当您编写return (1+2) 时,它实际上运行do it &lt;- return (1+2) ; print it。在您的代码中,您在main 中运行askForWords,但默默地丢弃它的结果。 GHCi 会将其转换为do it &lt;- askForWords ; print it,但在程序中您必须明确说明(并且可能使用putStrLn 而不是print)。

标签: haskell printing compiled


【解决方案1】:

你没有打印输出,你只是返回它。您的可执行文件实际上忽略了 main 的返回值,它通常具有类型 IO () 来强调这一点。

module Main
    where

import System.IO

main = do
  result <- askForWords
  putStrLn result

askForWords = do
  putStrLn "Pleas enter a word:"
  word <- getLine
  if word == ""
    then return []
    else do
      rest <- askForWords
      return (word ++ " " ++ rest)

在 GHCi 中(就像大多数语言中的 REPL),表达式的值被打印到终端。

main 也可以更简单地定义为

main = askForWords >>= putStrLn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2011-03-03
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多