13

[ http://hackage.haskell.org/trac/haskell-prime/wiki/DoAndIfThenElse ]で言及されている簡潔な if-then-else 表記を機能させる方法がわかりません。これは機能し、

import System.Environment
main = do
    args <- getArgs
    if (args !! 0) == "hello"
        then
            print "hello"
        else
            print "goodbye"

しかし、これはそうではなく、上記のセミコロン(リンクを参照)を挿入すると、解析エラーが発生するだけです。

import System.Environment
main = do
    args <- getArgs
    if (args !! 0) == "hello" then
        print "hello"
    else
        print "goodbye"
4

4 に答える 4

12

あなたが提供したリンクは提案を説明していますが、それはHaskell標準の一部ではないようです(リンクはjhc、GHC、Hugsで実装されていると述べていますが)。使用しているHaskellコンパイラのバージョン、または使用しているフラグのセットが、リンクで説明されているオプションのセミコロンの動作を許可していない可能性があります。

これを試して:

import System.Environment
main = do
    args <- getArgs
    if (args !! 0) == "hello" then
        print "hello"
        else
            print "goodbye"
于 2011-05-24T22:42:31.047 に答える
5

Haskell 98 では、「if … then … else …」は単一の式です。複数の行に分割されている場合は、最初の行に続く行をさらにインデントする必要があります。

以下が間違っているように…</p>

do
  1 +
  2

…そして次の作品…</p>

do
  1 +
    2

…以下も間違っています…</p>

do
  if True then 1
  else 2

…そして次の作品。

do
  if True then 1
    else 2

他のコメントがすでに述べているように、Haskell 2010では、「if」部分と同じレベルのインデントで「then」部分と「else」部分を使用できます。

于 2011-05-24T23:47:08.277 に答える
3

Haskell の構文と言語は、ソース ファイルの先頭にある {-# LANGUAGE ... #-} プラグマによって拡張されます。DoAndIfThenElse 拡張機能は、Cabal のドキュメントにリストされているものの 1 つであるため、認識されます。現在の GHC では、これがデフォルトで有効になっています。

于 2011-05-25T11:22:35.903 に答える
2

else私は通常、.よりも 1 つのスペースをインデントしifます。そうでない限り、全体ifが1行にうまく収まります。

于 2011-05-24T23:26:31.603 に答える