Я придумал это, но на самом деле это небезопасно, поскольку он не обрабатывает неправильную строку, такую как "AA11B2C3"
!
splitingN :: Int -> [a] -> [[a]]
splitingN _ [] = []
splitingN n l
| n > 0 = take n l : splitingN n (drop n l)
| otherwise = error "uhhhhhh"
tuplify :: String -> (Char, Int)
tuplify a = (head a, read $ tail a)
stringy :: String -> [(Char, Int)]
stringy s = tuplify <$> splitingN 2 s
> stringy "A1B2C3D4" == [('A',1),('B',2),('C',3),('D',4)]
Гораздо более приятный способ, но все же не полностью безопасный:
stringy :: [a] -> [(a, a)]
stringy [] = []
stringy (a : b : rest) = (a, b) : splitting rest
stringy [a] = error "uhhhhh"
Должен действительно проверить, действительно ли a
и b
из (a : b : rest)
Char
& Int
. Также здесь используется рекурсия, и вы упомянули об использовании map
, поэтому может быть недостаточно, и это довольно полиморфно в своих типах.