【问题标题】:How to fix 'parse error on input ‘=’' when compile the following quicksort example?编译以下快速排序示例时如何修复输入“=”时的“解析错误”?
【发布时间】:2019-05-01 18:08:58
【问题描述】:

将下面的代码放入.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’ 失败,已加载模块:无。

【问题讨论】:

    标签: linux haskell ghci


    【解决方案1】:

    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

    在您最初的问题中,您还忘记在列表理解的生成器表达式部分使用&lt;- 运算符:因此您应该写a &lt;- 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 -&gt; Bool) -&gt; [a] -&gt; ([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 函数通常以这样的方式实现,它只在给定列表上迭代一次,并且只执行一次测试。因此,这通常比使用两个列表推导(每个单独过滤给定列表)更有效。

    【讨论】:

    • 如果需要@987654335,在biggerSorted= 之间添加一个额外的空格(或任意多个空格)可能是值得补充的@ 标志在同一列中。 (我在网上的代码示例中看到了这一点。)正如你所说,唯一重要的是 let 声明的开头 - 变量名 - 对齐。
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多