2017-09-10 3 views
7

Haskell indentation rulesによれば、 ""の式の一部であるコードは、その式の先頭よりさらにインデントされるべきである。 "。しかし、私は上記の規則に違反しているようだこれは、次の例を見つけ、任意のエラーや警告なしでコンパイル:if-then-elseに対するHaskell字下げ規則の違反

someFunction :: Bool -> Int -> Int -> Int 
someFunction condition a b = if condition 
then a - b 
     else a + b 

ここで私は機能someFunctionを定義しています、その本体はif-then-elseブロックです。字下げ規則によれば、thenブロックは、最初の行の同じ式の一部であるため、前の行よりもインデントされている必要があります。しかし私の例では、2番目の行thenは最初の行と同じ列から始まり、この例はコンパイルされます。

ここで何が起こっているのかわかりません。私はGHCバージョン8.0.1で作業しています。

答えて

6

これはdeliberate GHC variation on the indentation ruleというアーティファクトであることが合理的に確信しています。ナイスキャッチ!

GHCは、解析エラーをトリガすべき

foo = do { 
    item ; 
    if a ; 
    then b ; 
    else c ; 
    item } 

としてこの

foo = do 
    item 
    if a 
    then b 
    else c 
    item 

を読み出します。

しかし、これは非常に一般的なので、GHCの開発者は、とelseの前に任意の;を許可することに決めました。 if文法への変更により、コードがコンパイルされます。

これは、ifが「特殊」になったことを意味します。これは、インデントされる必要はなく、前の項目と同じくらいです。質問に投稿されたコードでは、thenは前の項目と同じくらいインデントされています。その前に暗黙的に;があり、それによってコードがコンパイルされます。

私はまだこの "スタイル"を避けようとしていますが、それは奇妙なものですから。

(個人的に、私はGHCに、この特殊なケースを追加していないだろう。しかし、それはとにかく、大したことではありません。)

を私は今Wikibookは、将来のための「提案」として、このバリアントを言及していることに気づきましたバージョンのHaskell。これは今では時代遅れですが、それ以来GHCで実装されています。

+0

命令的なコードでは、私は 'condと\ nfoo \ nelse \ nbar'スタイルの美しさにしか耐えることができません。ありがとうございました。 – luqui

関連する問題