9

Haskell コードを書くためのインデント規則の完全なセットはどこから入手できますか?

私の次の質問に似た過去のSOの質問により、上記の質問をするようになりました。エラー メッセージの背後にある理由は何ですか: parse error on input 'something'?

私が得たエラーメッセージ:

baby.hs:103:2: 入力 `myList' の解析エラー (この行のエラー)

コンパイルしようとしているコード:

myList = ["aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", "Zebra"]
quicksort :: (Ord a) => [a] -> [a]  
quicksort [] = []  
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <- xs, a <= x]  
biggerSorted = quicksort [a | a <- xs, a > x]  
in smallerSorted ++ [x] ++ biggerSorted

Optimight による編集:

質問のコードを新しい .hs ファイルにシフトしてコンパイルしようとしました。それでも同様のエラー メッセージが残ります。以下の詳細:

エラー
quickSort.hs:5:62: 入力 `=' の解析エラー 失敗、ロードされたモジュール: なし。(0.02 秒、0 バイト)

コード クイックソート :: (Ord a) => [a] -> [a]
クイックソート [] = [] クイックソート (x:xs) = let smallSorted = quicksort [a | a <- xs, a <= x]
bigSorted = quicksort [a | xs, a <= x] a <- xs, a > x]
in smallSorted ++ [x] ++ bigSorted
myList = ["aeroplane", "aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", "Zebra", "America"]

4

2 に答える 2

12

少なくとも標準の Haskell (言語拡張なし) の場合、レイアウト規則はHaskell 2010 レポートのセクション 10.3 で説明されています。

レポートは、あなたの好みでは少しフォーマルかもしれません。Haskell に関するさまざまなチュートリアルや教科書には、Haskell Wikibook など、レイアウト ルールの非公式な説明があります。

特定のケースでは、エラー メッセージは 103 行を指していますが、数行しか貼り付けていません。少なくとも let-in コンストラクトのインデントが壊れていることがわかります。次のように書く必要があります。

xs = ["aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER", "Zebra"]
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = let smallerSorted = quicksort [a | a <- xs, a <= x]
                       biggerSorted = quicksort [a | a <- xs, a > x]
                   in smallerSorted ++ [x] ++ biggerSorted
于 2012-06-29T12:51:24.573 に答える
3

私があなたを正しく理解していれば、この問題を回避する最も簡単な方法は、単一dolet次のように書くことです。

fName = do
  expression1 = ...
  exp2 ...

fName param = let
  exp1 = ...
  exp2 = ...
  exp3 = ...
  in ...        -- can be indented more if you want

exp1ここでの主なポイントは、新しい行ごとに 最初のインデントを簡単に見つけて維持できることです。




そして、これが私の学習シートからのコピー/貼り付けです。それは多くはありませんが、誰かを助けるかもしれません。誰かが間違っている/間違っていることに気づいたら、私を修正してください。

タブまたはスペースは、{com1; のようにブロックを示します。com2} C++ で

オフサイド ルール: ソース ファイルの先頭では、最初のトップ レベルの宣言または定義を任意の列から開始できます。後続のすべてのトップレベル宣言は、同じインデントを持つ必要があります!

LET IN, WHERE は、次に見たトークンのインデントを記憶します。空行またはインデントがさらに右にある場合は、前の行に続きます。同じインデントの場合、これは同じブロック内の新しいアイテムの始まりです。

win tab 4 spc、unix tab 8 スペース タブの代わりにスペースを使用!!!

line1... 
   continue line 1 -- as long it doesn't start at same indent as line1
   3spaces would indicate block with line 1!
   line4 same block
   same indent is same line1 block
   all indents for BLOCK must be same.

line8...    -- is new block and end of line1 block
   positon of first column in block is start

line 1
 cont line1
  cont line 1
   cont line 1
    block1  -- would be cont line 1
    block1  --  if not for this block1 at same indent


Bad way:
do
  action0
  if condition
  then action1
  else action2
  action3

Good way:
do
  action0
  if condition
    then action1
    else action2
  action3
于 2012-06-30T07:59:51.233 に答える