在哈斯克尔缩进代码

时间:2012-02-02 06:05:26

标签: haskell

我知道缩进在Haskell中很重要。我怎么能缩进这个程序?

qsort [] =[]
qsort (x:xs) = let bigsorted = [a| a<-xs,a>=x]
       smallsorted= [a| a<-xs,a<x]
       in qsort bigsorted ++ [x] ++ smallsorted

我正在使用vim编辑器。有没有什么方法可以自动缩进程序?

4 个答案:

答案 0 :(得分:6)

要记住的一个简单规则是将某个组的项目进一步缩进到该组的开头。例如,让我们看看let-bindings组:

let
  x = 2 + 3 -- this line is indented further than "let" which starts the group.
  y = x + x -- next lines are usually indented on the same level

另一个例子是do-block:

do
  line <- getLine
  putStrLn line

更多细节可以在Haskell wiki中找到:http://en.wikibooks.org/wiki/Haskell/Indentation

在你的例子中,“smallSorted”的缩进比let-group的开头少,因此它不被认为是let-group的一部分。

Emacs haskell-mode中存在半自动缩进。实际上,缩进有三种不同的模式,但没有一种模式可以很好地工作,因为消除用户真正意义的含义并不容易。关于Haskell wiki的更多细节: http://www.haskell.org/haskellwiki/Haskell_mode_for_Emacs#Indentation

答案 1 :(得分:5)

qsort []     = []
qsort (x:xs) = 
  let bigsorted   = [a | a <- xs, a >= x]
      smallsorted = [a | a <- xs, a < x]
  in  qsort bigsorted ++ [x] ++ smallsorted

答案 2 :(得分:4)

这里smallsorted不是let块的一部分。

qsort [] =[]
qsort (x:xs) = let bigsorted = [a| a<-xs,a>=x]
                   smallsorted= [a| a<-xs,a<x]
                in qsort bigsorted ++ [x] ++ smallsorted

答案 3 :(得分:1)

只是一种风格化的东西 - 如果你喜欢以那种格式编写代码(就像我一样),你可以使用where,虽然这意味着你还需要将你的最终表达式放在开头而不是结束。

qsort [] =[]
qsort (x:xs) = qsort bigsorted ++ [x] ++ smallsorted where
       bigsorted = [a| a<-xs,a>=x]
       smallsorted= [a| a<-xs,a<x]