Вот проблема, с которой я столкнулся. У меня есть некоторые функции, которые похожи по своему телу (с небольшой разницей), но у них есть подписи.
flatB :: [[String]] -> [[String]]
flatB [] = []
flatB [x] = [x]
flatB (a : b : xs) | isDigit (head n) = replicate (read n :: Int) a ++ flatB xs
| otherwise = a : flatB (b : xs)
where n = head b
flatC :: [String] -> [String]
flatC [] = []
flatC [x] = [x]
flatC (a : b : xs) | isDigit (head b) = replicate (read b :: Int) a ++ flatC xs
| otherwise = a : flatC (b : xs)
Я ожидаю, что функция сделает следующее:
> flatC ["a","2","b"]
["a","a","b"]
> flatB [["a","b"],["2"]]
[["a","b"],["a","b"]]
Код выше работает. Но мне интересно, есть ли более простой способ добиться этого?
Я думаю, что создание класса типов может быть способом, но я не знаю, как это сделать.