2012-02-02 2 views
0

私は、インデントが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エディタを使用しています。プログラムを自動的にインデントする方法はありますか?

+1

実際のクイックソートの実装を得るには、 "smallsorted"を "qsort"する必要があるようです。 –

答えて

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 
5
qsort []  = [] 
qsort (x:xs) = 
    let bigsorted = [a | a <- xs, a >= x] 
     smallsorted = [a | a <- xs, a < x] 
    in qsort bigsorted ++ [x] ++ smallsorted 
6

覚えておくべき簡単なルールは、このグループの先頭よりもさらに右側のグループの項目をインデントすることです。たとえば、のは、聞かせてバインディンググループに見てみましょう:

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ブロックされています:

do 
    line <- getLine 
    putStrLn line 

詳細はHaskellのウィキで見つけることができます:あなたはhttp://en.wikibooks.org/wiki/Haskell/Indentation

例 "smallSorted"はlet-groupの先頭よりもインデントされていないため、let-groupの一部として認識されませんでした。

半自動インデントはEmacs haskell-modeにあります。実際には、インデントのための3つの異なるモードがありますが、ユーザーが実際に何を意味するのかを明確にすることは容易ではないので、本当にうまくいきません。 Haskellのwikiに再び詳細: http://www.haskell.org/haskellwiki/Haskell_mode_for_Emacs#Indentation

1

ただ、文体の事 - あなたは(私がそうであるように)その形式でコードを書くことが好きならそれはまた、あなたの最終的な式を配置する必要があることを意味しますが、あなたは、whereを使用することができます終わりではなく始点で。

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