2016-04-27 17 views
2

私はちょうどハスケルを学び始めて、オンラインでいくつかの問題を抱えています。ほとんどの場合、私は解決策を理解することができますが、私は期待される出力形式で印刷することができません。ハスケルでパスカルの三角形を印刷

たとえば、私はパスカルの三角形のプログラムを実行しようとしました。 PascalのTriangleをIntsのリストのリストとして生成する方法を見つけましたが、それをどのように印刷するかは分かりません。

ここに私のコードです。

import Data.List 
pascal n = map liner [0..n] 
    where liner x = map (comb x) [0..x] 

comb n 0 = 1 
comb 0 r = 0 
comb n r = comb (n-1) (r-1) * n `div` r 

main = do 
    order <- getLine 
    let output = pascal . (read :: String -> Int) $ order 
    print output 

現在、出力は、私は、フォーム私はこれをどのように行うのです

1 
1 1 
1 2 1 
1 3 3 1 
... 

でそれを印刷したい

[[1],[1,1],[1,2,1],[1,3,3,1]... 

のようなものですか?私はmapM_やintercalateのようなものを使ってみました。私はまだモナドには入っていないので、mapMのしくみを理解できません。

+0

本当にモナドを理解する必要はありません。 'f = unlines。 map(intercalate ""。map show) 'は' [[Int]] '値の中から目的の' String'値を生成します。単に結果を 'putStr'に渡します。 – Jubobs

+3

と 'intercalate" "'は 'unwords'だけです - あなたは' putStr 'でそれを取得します。行かない。地図(unwords。地図表示) ' – Carsten

+0

美しいアア。私は 'lines'と' unlines'と 'map'をすべて混同していました。私は正しい方法で 'ショー 'を使っていませんでした。ありがとう! –

答えて

3

これを行うにはいくつかの方法がありますが、最も単純な方法(IMO)は次のとおりです。

putStrLn $ intercalate "\n" $ map (intercalate " " . map show) output 

この最初の文字列(showを使用して)に、リスト内の数値の全てを変換します。次に、最も内側のリストを文字列に変換します。各要素はスペースで区切られます(intercalate " "を使用)。次に、の最も外側のリストを、各要素が改行intercalate "\n"を使用)で区切られた文字列に変換します。最後に、結果の文字列をstdoutにプッシュします。 mainの最後の行をこれに置き換えてください。それはあなたが望むようにする必要があります。

EDIT:Yakymは彼の答えで述べたように 、intercalate " "intercalate "\n"はもう少し簡潔な(それもData.Listの輸入の必要性を取り除く)上記のコードを作り、unwordsunlinesと交換することができます。

putStr $ unlines $ map (unwords . map show) output 

unlinesが自動的に出力の最後に改行を追加しますので、私はputStrputStrLnを変更しました。

2

また、文字列リストに自然なインターカレーションを行うunlinesunwordsのような機能もあります。

pascal :: [[Int]] 
pascal = iterate (\row -> zipWith (+) ([0] ++ row) (row ++ [0])) [1] 

printPascal :: [[Int]] -> IO() 
printPascal = mapM_ (putStrLn . unwords . map show) 

--*Main> printPascal $ take 10 pascal 
--1 
--1 1 
--1 2 1 
--1 3 3 1 
--1 4 6 4 1 
--1 5 10 10 5 1 
--1 6 15 20 15 6 1 
--1 7 21 35 35 21 7 1 
--1 8 28 56 70 56 28 8 1 
--1 9 36 84 126 126 84 36 9 1 
+2

'' [0] ++ row'は '0:row'に単純化することができます –

+0

あなたは正しいです。私はHaskell wiki https://wiki.haskell.org/Blow_your_mindからその行を借りました - 私は上記のバージョンは対称性が原因だと思います。 –