2

複数の文字列入力を取得し、空の行 ('\n') で終了する関数を作成しようとしています。

getLines :: IO [String]
getLines = do x <- getLine
           if x == ""
           return ()
           else do xs <- getLines
                return (x:xs)

if ステートメントに何か問題があると言ってコンパイルに失敗します

理想はこんな感じで働きたい

getLines

アップル

ネコ

(エンターを押す)

出力: ["りんご","鳥","猫"]

4

2 に答える 2

7

thenafterが必要でif()(空のタプル) は[](空のリスト) である必要があります。ではifthenelseが別の行にある場合は、 もインデントする必要があります。これif then elseは、 が演算子であるためです。コンパイラは、式が続くことを認識する必要があります。すべてが先頭よりもインデントされるように、インデントを調整する必要がありますdo

getLines :: IO [String]
getLines = do x <- getLine
              if x == ""
                then return []
                else do xs <- getLines
                        return (x:xs)

または、先頭の を含むよりもすべてがインデントされますdo

getLines :: IO [String]
getLines = do
  x <- getLine
  if x == ""
    then return []
    else do
      xs <- getLines
      return (x:xs)

スタイルの問題として、 のnull x代わりに使用することもできますx == ""

于 2013-04-03T21:18:48.317 に答える
1

これはほぼ正しいです。

thenの後にが必要ですifxまた、すべてがではなくまでインデントされるように、インデントを少し変更する必要がある場合もありますdo。私はそれがちょうどそれをするべきだと思います。

于 2013-04-03T21:05:53.537 に答える