"replace" a 3-tuple

У меня есть следующий список (это список длины 2, но в моем задании у меня список длины +n)

xxs = [(11,22,[(33,33,33),(44,44,44)]),(55,66,[(77,77,77),(88,88,88)])]

Я пытаюсь "заменить" один 3-кортеж (p1 или p2 или p3 или p4 с картинки ниже) по индексу списка (n) и по индексу подсписка (p).

Visual of list breakdown

Функция в конце должна выглядеть так:

fooo newtuple n p = (…)

Например: (заменить p3 на (98,98,98):

fooo (98,98,98) 2 1 
[(11, 22, [(33,33,33) , (44,44,44)]) , (55, 66, [(98,98,98),(88,88,88)])]  

Я спланировал код следующим образом:

  1. Получите доступ к pn, который я хочу изменить. Мне удалось добиться этого следующим образом:

    fob n p = ((aux2 xxs)!!!n)!!!p
     где aux2 [] = []
     aux2 ((_,_,c):xs) = c:aux2 xs
    
  2. "заменить" 3-кортеж. Мне очень нужна помощь. Я застрял. Лучший код (в моей голове он имеет какой-то смысл), который я сделал: (помните: пожалуйста, не будьте слишком плохи к моему коду, я изучаю Haskell всего 5 недель)

    foo n p newtuple = fooAux newtuple fob 
     где fooAux _ [] = [] 
     fooAux m ((_):ds) = m:ds
     fob n p = ((aux2 xxs)!!!n)!!!p
     где aux2 [] = []
     aux2 ((_,_,c):xs) = c:aux2 xs
    
  3. Наконец, я соберу все вместе, используя splitAt.

Правилен ли мой подход к решению проблемы? Я был бы очень признателен за помощь по шагу 2.

8
задан Bill the Lizard 18 September 2012 в 14:04
поделиться