文字列str
の場合、文字の後にすべての文字が削除されますc
?ハスケルのn番目の文字の後にすべての文字を削除する
たとえば、str
が"2016-10-20"
の場合、-
の2回目の出現後にすべての文字を削除すると、"2016-10"
となります。
文字列str
の場合、文字の後にすべての文字が削除されますc
?ハスケルのn番目の文字の後にすべての文字を削除する
たとえば、str
が"2016-10-20"
の場合、-
の2回目の出現後にすべての文字を削除すると、"2016-10"
となります。
標準ライブラリに便利なsplit
関数はありません。したがって、本質的にあなた自身をロールバックする必要があります。一つのアプローチ:
import Data.List.Split (splitOn)
import Data.List (intercalate)
dropAfter n d = intercalate [d] . take n . splitOn [d]
倍の悪魔のストライキを再び:
dropAfter :: Int -> Char -> String -> String
dropAfter _ _ "" = ""
dropAfter 0 d (x:xs) = ""
dropAfter 1 d (x:xs) | x == d = ""
dropAfter n d (x:xs) | x == d = x : dropAfter (n-1) d xs
| otherwise = x : dropAfter n d xs
split
パッケージは、しかし、splitOn :: Eq a => [a] -> [a] -> [[a]]
を提供します。
dropAfter :: Int -> (a -> Bool) -> [a] -> [a]
dropAfter n _ _ | n < 1 = []
dropAfter n f xs = foldr go (`seq` []) xs n where
go x r !k
| f x = if k == 1 then [] else x : r (k - 1)
| otherwise = x : r k
代わりに、あなたはパーサを使用して起動する足がかりとしてこれを使用することができます:
λ import Text.Parsec
λ runParser (many (noneOf "-") `sepBy` char '-')() "example from question" "2016-01-43"
Right ["2016","01","43"]
λ import Data.List
λ intercalate "-" . take 2 <$> it
Right "2016-01"
今スイッチを作るのいいところは、あなたがあなたの入力(とものについての詳細を学ぶように、ということですそれは見えるようにすることもできないこともあります)、パーサーを一致させるためにパーサーを更新するのはかなり簡単です。
'-'の出現が2回未満の場合、あなたの例で何が起きるでしょうか? – Alec