0

数日前にHaskellを学び始めたばかりで、いくつかの問題に遭遇しました。最初の問題は、数字のリストを印刷することを扱っています。望ましい動作は次のとおりです。

入力:[1,2,3,4,5,6]

出力:1 2 3 | 4 5 6

したがって、その単純な概念では、リストの要素を「|」で出力する必要があります。3つの数字の間に記号が挿入されていますが、私は一生それを理解することができません。私が試したもののほとんどは文字列に関係しているようで、["1"、 "2"、 "3"、...]などの文字列にリストを取得できたとしても、私が行ったすべてのメソッド私が必要としているものではない独自の行にそれぞれ番号を印刷してみました。

どんな助けでも大歓迎です。

4

4 に答える 4

5

分割パッケージの使用(最近Haskellプラットフォームに追加されました):

> import Data.List         -- for intercalate
> import Data.List.Split   -- for chunksOf
> intercalate " | " . map unwords . chunksOf 3 $ map show [1..7]
"1 2 3 | 4 5 6 | 7"

関連ドキュメント:chunksOf、、unwordsintercalate

于 2012-11-25T20:41:39.537 に答える
3

これが1つの方法です。

import Data.List (cycle)

format :: Show a => [a] -> String
format = concat . zipWith (++) ("" : cycle [" ", " ", " | "]) . map show

これには、3つのグループへのグループ化がハードコーディングされているという欠点がありますが、一般化するのはそれほど難しくありません。

于 2012-11-25T20:40:11.633 に答える
2

あなたができる

threes [] = ""
threes xs = let (front,rest) = splitAt 3 xs in
   unwords (map show front) ++ 
      if null rest then "" else " | " ++ threes rest

与える

*Main> threes [1..10]
"1 2 3 | 4 5 6 | 7 8 9 | 10"

私が使用した関数:

splitAt :: Int -> [a] -> ([a], [a])
  -- splitAt 2 "Hello Mum" = ("He","llo Mum")

unwords :: [String] -> String
  -- unwords ["Hello","there","everyone"]
  --        = "Hello there everyone"

null :: [a] -> Bool
null [] = True
null _ = False
于 2012-11-25T20:38:02.293 に答える
1

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"|"によって行われるすべてのチャンクの間に挿入する必要があり、最後に、すべての文字列をスペースで連結します。intercalateData.Listunwords

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
于 2012-11-25T20:47:24.100 に答える