1

以下のような文字列のリストを印刷したい。

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

私は以下を使用してこれを達成することができました。

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

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

4

4 に答える 4

4

まず、私はそれを次のように書きます:

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

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

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

まあ、多分もっと好きです:

concatMap (printf "|%s\t")

わかった。それで、それは「言葉なし」として行うことができますか?

-- | '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

いいえ。ただし、concatMapをフォルダとして記述できるかどうかを確認してください...

于 2009-05-12T01:36:27.020 に答える
4

'|'の間に追加のスペースがあるようです と単語なので、この関数を使用できます。

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

少し説明:

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

次に、mapこの関数を単語のリストに適用して、["|1", "|USA", "|20", ... ]

次に、unwordsそれらを単語間にスペースを入れて文字列に結合します。++ "|"ファイナルを追加するには|

于 2009-05-12T01:49:37.183 に答える
4

Data.List散在と呼ばれる機能があります。おそらくあなたはそれを使うことができます。

printfieldName xs = "|" ++ unwords (intersperse "|\t" xs) ++ "|"
于 2009-05-12T02:15:17.033 に答える
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 |
于 2010-02-23T22:00:45.527 に答える