haskell - Haskell 中将函数从 LET 迁移到 WHERE

标签 haskell

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

这是迁移后的函数:

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]  

但是在我看来它不起作用。 有什么不对?使用 LET 的函数可以移植到 WHERE 吗?

这是我的错误输出:

/Users/graph/Documents/Uni/Haskell/hey.hs:43:5:
    parse error on input `biggerSorted'
Failed, modules loaded: none.

非常感谢!

最佳答案

您需要匹配 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]  

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]  

关于haskell - Haskell 中将函数从 LET 迁移到 WHERE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13552544/

相关文章:

haskell - 如何从 blaze 获取 html -- 打印到文件

haskell - 最长公共(public)子序列 (Haskell)

haskell - 为什么 haskellwiki 素数实现有一个单位参数

arrays - 切片 IOArray(或一般的 MArray)

haskell - groupBy 函数,对不相邻的元素进行分组

haskell - 使用 newtype 包装创建 Ord 实例

haskell - 如何在haskell中使用以下方法获得无限的权力列表

haskell - 结构化 Haskell 模式 [SHM] : How to delete single bracket or string quote by <backspace> or <del>?

haskell - 在 Haskell 中,当使用 XStrict 语言扩展时,是否会短路?

email - Haskell:基于 SSL 的 SMTP