将下面的代码放入.hs文件,尝试通过“:t xx.hs”导入,但是出现了错误。.我怀疑在看到其他问题后这是语法问题。希望有人可以帮助我。
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
获取错误:
不在范围内:“ a” 失败,模块已加载:无。
答案 0 :(得分:5)
let
子句中两个声明的缩进应该匹配,例如:
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <- xs, a <= x]
biggerSorted = quicksort [a | a <- xs, a > x] -- no extra spacing
in smallerSorted ++ [x] ++ biggerSorted
在最初的问题中,您还忘记了在列表理解的生成器表达式部分中使用<-
运算符:因此,您应该写a <- xs
而不是a xs
。
但是,您可以按照@RobinZigmond的说法,在=
之前和之后添加空格,只要在第一个非空格字符之前有相同数量的空格,就可以了,例如:
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <- xs, a <= x]
biggerSorted = quicksort [a | a <- xs, a > x] -- extra space before =
in smallerSorted ++ [x] ++ biggerSorted
请注意,您可以使用partition :: (a -> Bool) -> [a] -> ([a], [a])
将列表分为两个列表,其中第一个子列表具有满足谓词的元素,而后一个子列表具有不满足谓词的元素。 ,例如:
import Data.List(partition)
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let (smal, big) = partition (x >) xs
in quicksort smal ++ x : quicksort big
partition
函数通常以在给定列表上仅迭代一次并且仅执行一次测试的方式实现。因此,这通常比使用两个分别对给定列表进行过滤的列表理解要有效(有点)。