преобразовать список строк в список кортежей, используя функцию foldl

У меня есть функция ниже:

fn :: [String] -> [(a,b,c)]
fn lst = case lst of
  [] -> []
  (a:b:c:xs) -> (a,b,c) : fn xs

Я хочу написать эту функцию, используя foldl или foldr


person khaled omar    schedule 13.05.2017    source источник
comment
Удачи с этим.   -  person melpomene    schedule 14.05.2017
comment
складки могут заменить рекурсии, которые естественным образом потребляют один элемент списка каждый раз. Здесь вы потребляете три, поэтому использовать для этого фолд неудобно. Наконец: 1) вы поняли, что ваша программа рухнет, если входной список не будет иметь длину, кратную 3? 2) у вашей функции неверный тип, она должна возвращать триплет строк.   -  person chi    schedule 14.05.2017
comment
спасибо за уточнение, когда функция fold может заменить рекурсию, что касается точек 1 и 2, вы совершенно правы, реальная сигнатура функции - [String] -> Maybe [(String,String,String)], я включил этот пример, чтобы упростить его. Я думаю, что использование этой подписи обрабатывает обе точки   -  person khaled omar    schedule 14.05.2017


Ответы (1)


Я хочу написать эту функцию, используя 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, он создает кортеж и добавляет его в список кортежей.

person Ami Tavory    schedule 13.05.2017