String
最初の部分が最も簡単です。数値をsに変換する必要があります。
format :: (Num a, Show a) => [a] -> String
format xs = result
where
strings = map show xs
それをします。n
次に、リストを3つの(より一般的な)要素のチャンクに分割する必要があります。splitAt
リストを必要な数の要素の前部(リストが十分に長い場合)と余りに分割します。空ではない状態で残りの手順を繰り返すと、目的の結果が得られます。
chunk :: Int -> [a] -> [[a]]
chunk _ [] = []
chunk n xs = ys : chunk n zs
where
(ys, zs) = splitAt n xs
これは繰り返しパターンなので、そのためのコンビネーターがあり、次のように書くこともできます。
import Data.List (unfoldr)
chunk :: Int -> [a] -> [[a]]
chunk n = unfoldr split
where
split [] = Nothing
split xs = Just $ splitAt n xs
だから私たちは私たちを続けることができますformat
、
format :: (Num a, Show a) => [a] -> String
format xs = result
where
strings = map show xs
chunks = chunk 3 strings
次に、 from"|"
によって行われるすべてのチャンクの間に挿入する必要があり、最後に、すべての文字列をスペースで連結します。intercalate
Data.List
unwords
format :: (Num a, Show a) => [a] -> String
format xs = result
where
strings = map show xs
chunks = chunk 3 strings
result = unwords $ intercalate "|" chunks
または
format = unwords . intercalate "|" . chunk 3 . map show