为了提高我的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)