1

いくつかのコードをチェックしていて、そのうちの1つを書き込もうとしましたが、解析「=」エラーが発生し続けますが、ソースからコードをコピーして貼り付けると正常に動作するので、これの違いは何ですか;

quicksort2 :: (Ord a) =>  [a] -> [a]
quicksort2 [] = []
quicksort2 (x:xs) =   
    let smallerSorted = quicksort2 [a | a <- xs, a <= x]  
        biggerSorted = quicksort2 [a | a <- xs, a > x]      
    in  smallerSorted ++ [x] ++ biggerSorted

この ;

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

quicksort2 では解析エラーが発生しますが、quicksort では発生しません。では、違いはどこにあるのでしょうか。

エラー -> .hs:5:26: 入力 `=' の解析エラー

4

1 に答える 1

8

1 つはインデントにタブが混在しており、もう 1 つはスペースのみを使用しています。Haskell では空白が非常に重要であり、エディタが Haskell (常に 8 を使用) とは異なるタブ幅で構成されている可能性があるため、これは問題を引き起こします。そのため、エディターでは問題ないように見えますが、コンパイラーにとってはインデントがすべてめちゃくちゃになっています。

Haskell から見たコードは次のようになります。

quicksort2 :: (Ord a) =>  [a] -> [a]
quicksort2 [] = []
quicksort2 (x:xs) =   
    let smallerSorted = quicksort2 [a | a <- xs, a <= x]  
            biggerSorted = quicksort2 [a | a <- xs, a > x]      
        in  smallerSorted ++ [x] ++ biggerSorted
^^^^^^^^
There are tabs here on the two lines above.

let-expression のバインディングが適切に配置されていないため、これにより構文エラーが発生します。

一般に、Haskell ではインデントにタブを使用しないでください。常にスペースを使用するようにエディターを構成すると、頭痛の種が大幅に軽減されます。

于 2013-05-06T17:00:14.883 に答える