2009-05-12 11 views
1

以下に示すような文字列のリストを印刷したいと思います。Haskellで 'unwords'を使って文字列のリストを印刷するには?

|Name|Country|Age| 
------------------ 
|1 |USA |20 | 
|2 |UK  |19 | 

これを実現するには、以下の方法があります。

printfieldName :: [String] -> String 
printfieldName [] = [] 
printfieldName (x:xs) = "|" ++ x ++ "\t" ++ printfieldName (xs) 

組み込み関数 'unwords'を使用してこれを実現できますか?私は 'unwords'を使ってそれを印刷することができましたが、単語の間に|を置くことができませんでした。

答えて

4

「|」そして、言葉、あなたがこの機能を使用できるように:

printfieldName x = unwords (map ((++) "|") x) ++ "|" 

少し説明:その後、

(++) "|" - creates a function which take prefixes each word with "|", so 
(++) "|" "test" -> "|test" 

map["|1", "|USA", "|20", ... ]

に変換した単語のリストにこの機能を適用し、その後unwordsは、それらを結合します単語の間にスペースを入れた文字列に変換します。 ++ "|"は、最後に追加する必要があります。|

+0

イムのhaskellする新しい、あなたはの流れを説明してください可能性があり関数は書かれています。できます!:) ありがとう – pier

+0

クール! (++) "|"各単語の先頭に "|"を付ける関数を作成するので、(++) "|" "test" - > "| test" 'map 'は、この関数を[" | 1 "、" | USA "、" | 20 "、...]に変換する単語のリストに適用します then 'unwords 'はそれらを単語の間にスペースを入れた文字列に結合します。 '++ '|' 'は最後に|を追加するのに必要です。 –

+0

申し訳ありませんが、コメントのすべての改行が失われました。私はここに新しいです:) –

4

まず、私はこのようにそれを記述します。

printfieldName []  = [] 
printfieldName (x:xs) = "|" ++ x ++ "\t" ++ printfieldName xs 

まあ、実際には、いや、このような:

concatMap (\x -> '|' : x ++ "\t") 

まあ、より多くのように:

concatMap (printf "|%s\t") 

OK 。だからそれは 'unwords'として行うことができますか?

-- | 'unwords' is an inverse operation to 'words'. 
-- It joins words with separating spaces. 
unwords     :: [String] -> String 
unwords []    = "" 
unwords ws    = foldr1 (\w s -> w ++ ' ':s) ws 

号しかし、あなたはfoldrとしてconcatMapを書くことができるかどうかを確認...私は追加のスペースが間にある参照

+0

私は今、この権利をしようとしたとき、私は、私はエラーを取得execute 入力の構文エラー(予期しないバックスラッシュ(lambda)) printfieldName :: [String] - >文字列 printfieldName [] = [] concatMap(\ X - > '|':X ++ "\トン") concatMap(printf関数 "|%sの\トン") おかげ – pier

+0

@dlnaより多くの情報が必要 プレリュードText.Printf> putStrLn $ concatMap (printfの "|%sの\ T")(マップ([])は "hello") |時間\t |電子\t |リットル\t |リットル\t | O –

4

Data.Listにはintersperseという機能があります。おそらくあなたはそれを使うことができます。

printfieldName xs = "|" ++ unwords (intersperse "|\t" xs) ++ "|" 
1

あなたが尋ねからトップの上におそらく少し、しかし:

formatTable :: [String] -> [[String]] -> String 
formatTable header rows = 
    formatRow header ++ dashRow ++ concatMap formatRow rows 

    where formatRow cells = bracket '|' (spread cells) 
      dashRow   = bracket '+' (map (\n -> replicate n '-') widths) 
      bracket c cells = concatMap (c:) cells ++ (c:"\n") 

      spread cells = zipWith pad widths cells 
      pad n s   = take n (s ++ repeat ' ') 

      widths = foldr maxLengths (repeat 0) (header : rows) 
      maxLengths = zipWith (\c l -> max (length c) l) 

そして、例えば:

> let h = words "Name Country Age" 
> let rows = map words ["1 USA 20", "2 UK 19"] 
> h 
["Name","Country","Age"] 
> rows 
[["1","USA","20"],["2","UK","19"]] 
> putStr $ formatTable h rows 
|Name|Country|Age| 
+----+-------+---+ 
|1 |USA |20 | 
|2 |UK  |19 | 
関連する問題