2016-08-08 12 views
2

私は画面に何かを描こうとしています。ハスケル:リストを受け取って何度か繰り返します

私の関数は、パラメータ(例えば[0,0,0,5,5,3,3,3,2,4,4,0])のintのリストを受け取り、私は反復する最大数([0,0,0,5,5,3,3,3,2,4,4,0])→5)から数回まで0

各繰り返しIリスト全体を調べ、String(連結する ""、 " - "、 "\ n")を生成します。 My機能がある

*** 
    *** ** 
    ****** ** 
    ********* 
    ********* 
------------- 

generateSTR (x:xs) = daux (x:xs) (maximum (x:xs)) (x:xs) "" 
    where daux (h:hs) mh (y:ys) strdib 
      | mh /= 0 && length(h:hs) == 0  = daux (y:ys) (mh-1) (y:ys) "\n" ++ strdib 
      | mh > h && mh > 0 && (h:hs) /= [] = daux hs mh (y:ys) "" ++ strdib 
      | mh <= h && mh > 0 && (h:hs) /= [] = daux hs mh (y:ys) "*" ++ strdib 
      | mh == 0 && length(h:hs) > 0   = daux hs mh hs "-" ++ strdib 
     daux [] 0 [] strdib = strdib 
     daux [] _ _ strdib = strdib 

問題は、私は唯一の(bは空白である「引き分けに最初の行を取得していますということです結果を書くのは、このようなものであることを仮定しています")。

bbb***bbbbbbb 

この最初の行は問題ありませんが、なぜ私のプログラムが停止するのかわかりません。確かに私は元のリスト(関数の3番目のパラメータ)を復元しようとしているときに何か間違っています。

3番目のパラメータは、元のリストを「保存」し、リスト全体を消費した後、「\ n」を連結し、元のリストを復元し、私は「何0

まで次の反復を継続すると仮定されます間違ってる?

ありがとうございます。

+2

どのようにリストを処理するのですか?リストと最大numと出力の関係はどういう意味ですか? – Netwave

+1

はい、私はあなたが何を意図しているかについても不明です。あなたは入力と希望の出力のいくつかの例を挙げることができますか? – luqui

+0

'length(h:hs)== 0'は決して真ではなく、'(h:hs)/ = [] 'は常に真であることに注意してください。 'length(h:hs)> 0'と同じです。 – ErikR

答えて

4

コードが髪の毛になってデバッグできない場合は、一歩踏み出して新しいアプローチを試してみてください。好ましくは、小さくて試験可能な構成要素から1つを構築すること。

この場合、高さのリストを示す縦棒グラフを生成しようとしています。あなたが発見したように、そうすることはです。しかし、簡単に水平バーを生成することはできますか?それは*文字のちょうどnの繰り返しです。

bar :: Int -> String 
bar n = replicate n '*' 

-- bar 5 = "*****" 

次のトリッキービットは、それが垂直になるように回転しています。それはハスケルの価値としてどのように見えるでしょうか? Stringの代わりに、それぞれが行を表すStringのリストを持っています。したがって、[replicate n '*']が長さnの単一の行としてある場合、私たちが望むのはreplicate n ['*']または長さnの行です。この定義は直接使用できますが、この操作は関数によって提供される行列を単に転置していることがわかりますData.List.transpose

verticalBar :: Int -> [String] 
verticalBar n = transpose [bar n] 

-- verticalBar 5 = ["*","*","*","*","*"] 

これは、水平バーのリストを垂直グラフにする方法を指摘する必要があります。

transpose . map bar 

しかし、これは正しくありません。いくつかの要素を失い、グラフが上下逆さまに見えます。水平に配置されたグラフが転置される前に不揃いにならないように、各行をパディングする必要があります。

graph :: [Int] -> String 
graph heights = unlines . transpose . map draw $ heights 
    where 
    maxHeight = maximum heights 
    draw height = replicate (maxHeight - height) ' ' ++ replicate height '*' ++ "-" 

次にグラフがあります。

λ putStrLn $ graph [0,0,0,5,5,5,3,3,3,2,4,4,0] 
    *** 
    *** ** 
    ****** ** 
    ********* 
    ********* 
------------- 
+0

完璧な説明。ありがとうございました! – JPrado

関連する問題