私の番号は9877342931235です。Haskellを使用して、次のように表示する必要があります。
987-734293-123-5
私はリストを散在させようとしましたが、もちろんそれはすべての桁の間に「-」を入れます。実際の結果を出すにはどうすればよいですか?
私の番号は9877342931235です。Haskellを使用して、次のように表示する必要があります。
987-734293-123-5
私はリストを散在させようとしましたが、もちろんそれはすべての桁の間に「-」を入れます。実際の結果を出すにはどうすればよいですか?
リストを指定された長さの部分に分割し、指定された区切り文字でそれらを結合するための簡単な一般的な解決策を次に示します。
splitercalate :: [Int] -> [a] -> [a] -> [a]
splitercalate (x:[]) _ s = take x s
splitercalate (x:xs) delim s =
case splitAt x s of
(a, []) -> a
(a, bs) -> a ++ delim ++ splitercalate xs delim bs
あなたの場合splitercalate [3, 6, 3, 1] "-" $ show 9877342931235
、あなたが望むものをあなたに与えるでしょう。
更新:以下のコメントでAntal SZが指摘しているように、関数 fromData.List
およびを使用すると、この関数をより簡潔に実装できData.List.Split
ます。
splitercalate chunks sep = intercalate sep . splitPlaces chunks
パッケージをインストールしsplit
(おそらく のようなことを行って)、関数と関数cabal install split
をインポートする必要があります。intercalate
splitPlaces
import Data.List (intercalate)
import Data.List.Split (splitPlaces)
2 つのバージョンは同等である必要があります。import
余分なs やパッケージへの依存が気にならない場合はsplit
、Antal SZ を使用してください。はるかに優れています。
OK、Data.List.Split を使用したくない場合は...
import Data.List (intercalate)
splitPlaces (n:ns) x = let (h, t) = splitAt n x
in h : splitPlaces ns t
splitPlaces _ x = []
splitercalate chunks sep = intercalate sep . splitPlace chunks
その時のあなたの答えはconcat . splitercalate [3,5,3,1] "-" $ show 9877342931235