这两者有什么区别(Haskell)

时间:2013-05-06 16:52:05

标签: sorting 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

和这个;

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没有。那么差异在哪里呢?

错误 - &gt; .hs:5:26:输入`='

时解析错误

1 个答案:

答案 0 :(得分: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 - 表达式中的绑定未正确对齐。

通常,避免在Haskell中使用制表符进行缩进。将编辑器配置为始终使用空格,这将为您节省很多麻烦。