这两者之间的区别是什么(Haskell)

nbd*_*dip 1 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
Run Code Online (Sandbox Code Playgroud)

还有这个 ;

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
Run Code Online (Sandbox Code Playgroud)

quicksort2得到解析错误但quicksort没有.那么区别在哪里?

错误 - > .hs:5:26:输入`='解析错误

ham*_*mar 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.
Run Code Online (Sandbox Code Playgroud)

这会产生语法错误,因为let-expression中的绑定未正确对齐.

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