Haskell 打印返回值(另一个 Haskell 教程,askForWords)

-1 printing haskell compiled

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

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)
Run Code Online (Sandbox Code Playgroud)

当我在 GHCi 中运行它时,它工作正常

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

"Hello World "
*Main> 
Run Code Online (Sandbox Code Playgroud)

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

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


[Process completed]
Run Code Online (Sandbox Code Playgroud)

我试过askForWords在 main with 中打印出来,putStrLn但得到了错误

<interactive>:2:10: error:
    Couldn't match type ‘IO [Char]’ with ‘[Char]’
    ...
    ...
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

你不是在打印输出,你只是在返回它。您的可执行文件有效地忽略了 的返回值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)
Run Code Online (Sandbox Code Playgroud)

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

main 也可以更简单地定义为

main = askForWords >>= putStrLn
Run Code Online (Sandbox Code Playgroud)