1

{ ... ; を適切に使用することで、Haskell の空白を区別しないようにすることができると、さまざまに言われてきました。... ;} これまでのところ、where 句を除いて、ほとんどこれを行うことができました。動作するコード例:

primes = 2 : sieve [3,5..] 
    where {sieve = ... };

同様に:

primes = 2 : sieve [3,5..] where {sieve = ...};

ただし、これは解析エラーです。

primes = 2 : sieve [3,5..]
where {sieve = ...};

where句の空白の開始を区別しないようにする方法はありますか?

4

2 に答える 2

4

whereのインデントにより、Haskell はprimesの定義が終了したと見なされるため、これは機能しません。whereトップレベルにぶら下がったままの句があるため、混乱します。

{}特定のキーワードの後にlet​​ブロックwhereof使用できcase foo ofますdo。したがって、あなたの場合、改行を省略するだけです。

primes = 2:sieve [3,5..] where {
sieve = ....
}
primes' = 2:sieve [3,5..] where
{sieve = ...}

本当にどこでも必要な場合は、明示的なモジュール宣言も使用する必要があります

module Main where {
;primes' = 2:sieve [3,5..]
where {sieve = ...}
}

ただし、これを行わずにインデントを使用することをお勧めします。Haskell の明示的な中かっこは通常、生成されたコード用であり、それらが手書きで書かれているのを見ると、ほとんどの場合do.

于 2013-05-31T20:06:06.520 に答える
2

中括弧とセミコロンの使用例については、haskell レポートの語彙素セクションの最後を参照してください。

コンパイルする必要がある簡単なプログラムを次に示します。

module Temp where {
foo = 1           
where x = 2        
}                  

レポートのこの部分のために、モジュール レベルで中括弧が必要であることに注意してください。

これらの明示的な左中括弧内では、前の暗黙的な左中括弧の左側に行がインデントされていても、中括弧の外側の構造に対してレイアウト処理は実行されません。

于 2013-05-31T20:27:40.180 に答える