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

一个在缩进中混合了制表符,而另一个只使用空格。这会导致问题,因为空格在 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 回答