У меня есть функция ниже:
fn :: [String] -> [(a,b,c)]
fn lst = case lst of
[] -> []
(a:b:c:xs) -> (a,b,c) : fn xs
Я хочу написать эту функцию, используя foldl
или foldr
У меня есть функция ниже:
fn :: [String] -> [(a,b,c)]
fn lst = case lst of
[] -> []
(a:b:c:xs) -> (a,b,c) : fn xs
Я хочу написать эту функцию, используя foldl
или foldr
Я хочу написать эту функцию, используя
foldl
илиfoldr
Это несколько некрасиво, но технически решает это с помощью foldr
(было бы легко адаптировать его к foldl
):
fn :: String -> [(Char, Char, Char)]
fn s = snd $ foldr toTriples ([], []) s where
toTriples :: Char -> (String, [(Char, Char, Char)]) -> (String, [(Char, Char, Char)])
toTriples c (cur, tups) | length cur < 2 = (c:cur, tups)
toTriples c (cur, tups) = ([], (c, cur!!0, cur!!1):tups)
В качестве накопителя используется пара cur
, текущая часть сканируемого кортежа, и tups
, список кортежей.
Если длина cur
меньше 2, он добавляет к нему текущий символ.
Если длина cur
равна 2, он создает кортеж и добавляет его в список кортежей.
fold
может заменить рекурсию, что касается точек1
и2
, вы совершенно правы, реальная сигнатура функции -[String] -> Maybe [(String,String,String)]
, я включил этот пример, чтобы упростить его. Я думаю, что использование этой подписи обрабатывает обе точки - person khaled omar   schedule 14.05.2017