编译以下快速排序示例时如何修复 'parse error on input ‘=’'?
How to fix 'parse error on input ‘=’' when compile the following quicksort example?
把下面的代码放到一个.hs文件中,尝试用":t xx.hs"导入它,但出现错误。我怀疑是语法问题,看了其他questions.Hopefully人可以帮助我。
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’
失败,加载模块:none.
let
子句中两个声明的缩进应该匹配,如:
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <b><-</b> xs, a <= x]
biggerSorted = quicksort [a | a <b><-</b> xs, a > x] -- no extra spacing
in smallerSorted ++ [x] ++ biggerSorted
在您的原始问题中,您还忘记了在列表理解的生成器表达式部分使用 <-
运算符:因此您应该写 a <- xs
,而不是 a xs
。
但是,您可以像 所说的那样,在 =
之前和之后添加 space,只要之前的 space 数量相同第一个非 space 字符,这很好,例如:
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])
将列表拆分为两个列表,其中第一个子列表包含满足谓词的元素,而后者包含满足 not[=33 的元素=]满足谓词,如:
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
函数通常以这样的方式实现,它只在给定列表上迭代一次,并且只执行一次测试。因此,这通常比使用两个分别过滤给定列表的列表理解更有效。
把下面的代码放到一个.hs文件中,尝试用":t xx.hs"导入它,但出现错误。我怀疑是语法问题,看了其他questions.Hopefully人可以帮助我。
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’ 失败,加载模块:none.
let
子句中两个声明的缩进应该匹配,如:
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerSorted = quicksort [a | a <b><-</b> xs, a <= x]
biggerSorted = quicksort [a | a <b><-</b> xs, a > x] -- no extra spacing
in smallerSorted ++ [x] ++ biggerSorted
在您的原始问题中,您还忘记了在列表理解的生成器表达式部分使用 <-
运算符:因此您应该写 a <- xs
,而不是 a xs
。
但是,您可以像 =
之前和之后添加 space,只要之前的 space 数量相同第一个非 space 字符,这很好,例如:
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])
将列表拆分为两个列表,其中第一个子列表包含满足谓词的元素,而后者包含满足 not[=33 的元素=]满足谓词,如:
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
函数通常以这样的方式实现,它只在给定列表上迭代一次,并且只执行一次测试。因此,这通常比使用两个分别过滤给定列表的列表理解更有效。