在Haskell中将函数从LET迁移到WHERE

pig*_*ack 3 haskell

为了提高我的Haskell技能,我决定通过一些示例代码并尝试以不同的方式重写.

这是初始功能:

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)

这是迁移的功能:

quicksort :: (Ord a) => [a] -> [a]  
quicksort [] = []  
quicksort (x:xs) = smallerSorted ++ [x] ++ biggerSorted 
    where smallerSorted = quicksort [a | a <- xs, a <= x]  
        biggerSorted = quicksort [a | a <- xs, a > x]  
Run Code Online (Sandbox Code Playgroud)

但是在我看来它不起作用.有什么不对?使用LET的函数可以移植到WHERE吗?

这是我的错误输出:

/Users/graph/Documents/Uni/Haskell/hey.hs:43:5:
    parse error on input `biggerSorted'
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

非常感谢!

huo*_*uon 14

您需要匹配where子句中表达式的缩进,例如

quicksort :: (Ord a) => [a] -> [a]  
quicksort [] = []  
quicksort (x:xs) = smallerSorted ++ [x] ++ biggerSorted 
    where smallerSorted = quicksort [a | a <- xs, a <= x]  
          biggerSorted = quicksort [a | a <- xs, a > x]  
Run Code Online (Sandbox Code Playgroud)

要么

quicksort :: (Ord a) => [a] -> [a]  
quicksort [] = []  
quicksort (x:xs) = smallerSorted ++ [x] ++ biggerSorted 
    where
        smallerSorted = quicksort [a | a <- xs, a <= x]  
        biggerSorted = quicksort [a | a <- xs, a > x]  
Run Code Online (Sandbox Code Playgroud)