【问题标题】:How to use "let" keyword to define multiple variables in Haskell如何使用“let”关键字在 Haskell 中定义多个变量
【发布时间】:2016-12-12 01:59:18
【问题描述】:

我在 Haskell 中有以下代码 sn-p 来实现快速排序算法。

quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smaller = quicksort [a | a <- xs, a <= x]
    bigger  = quicksort [a | a <- xs, a > x]
in smaller ++ [x] ++ bigger

但是,GHCi 拒绝告诉我第 5 行有语法错误的程序。但是我检查了“let”关键字的 Haskell 语法,看起来还可以。

有没有人可以帮我解决这个问题?非常感谢。

【问题讨论】:

  • 因为let 不能与您的函数在同一列中,在本例中为第 1 列。只需在第 5 行开始的行首添加一个空格。
  • 对你的问题有点不切实际,但如果你正在学习haskell,它可以帮助你:请注意,这个算法并不是真正的快速排序。它不使用常量内存。 augustss.blogspot.cz/2007/08/…
  • @user1747134 还有this 及其链接。

标签: haskell let


【解决方案1】:

您需要缩进let 表达式,因为它是上一行的延续。

quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
  let smaller = quicksort [a | a <- xs, a <= x]
      bigger  = quicksort [a | a <- xs, a > x]
  in smaller ++ [x] ++ bigger

【讨论】:

    【解决方案2】:

    另一种方法您可以使用大括号和分号将其写在一行中{ ; ; ; }

    quicksort (x:xs) = let {smaller = quicksort [a | a &lt;- xs, a &lt;= x]; bigger = quicksort [a | a &lt;- xs, a &gt; x]} in smaller ++ [x] ++ bigger

    【讨论】:

      【解决方案3】:

      看看这个。一个可能有用的例子:

      let (a, b, c) = (1, 2, 3) 在“代码的其余部分”中

      关于你的例子:

      quicksort :: (Ord a) => [a] -> [a]
      quicksort [] = []
      quicksort (x:xs) =
          let (smaller, bigger) = ( quicksort [a | a <- xs, a <= x]
                                  , quicksort [a | a <- xs, a >  x]) 
          in  smaller ++ [x] ++ bigger
      

      【讨论】:

      • 我看不出这与问题有什么关系,你能详细说明一下吗?
      • 我的错误。我有错误。已编辑并解决
      • 啊,现在我明白了。您正在展示如何在一个绑定中绑定多个变量,这似乎是问题的标题,但在阅读了描述之后,我认为提问者并不是真的在寻找那个。另外,请格式化您的代码,请参阅stackoverflow.com/editing-help#syntax-highlighting
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多