Haskell quicksort:用'where'解析错误

Por*_*rco 2 haskell

我刚刚开始教自己Haskell出自"为了好的方面了解你一个好的东西"一书,我在第5章中使用where以下内容重写了快速排序:

quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = smaller ++ [x] ++ bigger
    where smaller = quicksort [a | a <- xs, a <= x]
      bigger = quicksort [a |a <- xs, a > x]
Run Code Online (Sandbox Code Playgroud)

但是当我将它加载到GHCi 7.0.3中时,我收到以下错误:

parse error on input '='
Run Code Online (Sandbox Code Playgroud)

书上的原始代码:

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
Run Code Online (Sandbox Code Playgroud)

你能帮我找到它为什么不能用where吗?

Mar*_*riy 7

那是空白规则.您的定义where必须在同一个空格缩进处.这将编译:

quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = smaller ++ [x] ++ bigger
    where smaller = quicksort [a | a <- xs, a <= x]
          bigger = quicksort [a |a <- xs, a > x]
Run Code Online (Sandbox Code Playgroud)

你可能想读这个.

  • 一个学究者写道......把它称为"空白"规则是不合适的,因为正确的压痕水平并不总是(实际上不是这里)仅由空白决定.这是"布局"规则.相关缩进级别由layout关键字后面的第一个标记确定.在这种情况下,关键字是`where`,因此给定的定义必须与`small`的开头对齐,其缩进级别包括非空白`where`的宽度.布局不仅仅是空白,在alpha转换下不是不变的,需要固定间距的字体! (7认同)
  • 根据经验,如果它们形成逻辑单元,则始终将线条对齐到相同的缩进. (2认同)