Обновить список из списка элементов в одном списке? - PullRequest
0 голосов
/ 02 мая 2011

У меня есть код, который предназначен для замены значения в списке

replaceNth n newVal (x:xs)
 | n == 0 = newVal:xs
 | otherwise = x:replaceNth (n-1) newVal xs

Например, когда я загружаю функцию в GHCI, я вхожу и получаю следующее:

*Main> replaceNth 3 4 [3,3,3,3,3]
[3,3,3,4,3]

Однако я пытаюсь использовать эту функцию для нескольких списков в списке и, похоже, не могу этого сделать (например,).

Я хочу получить такой результат:

[[3,3,3,3,3],[3,3,3,**2**,3],[3,3,3,3,3]]

Из этого [[3,3,3,3,3], [3,3,3,3,3], [3,3,3,3,3]]

используя что-то вроде функции выше.

Ответы [ 4 ]

3 голосов
/ 02 мая 2011

Ваша функция не достаточно общая, чтобы справиться с задачей, которую вы хотите выполнить.В частности, вам нужно знать, какое значение замещения будет до того, как вы вызовете функцию.Чтобы это работало, вы можете:

  • выбрать n-й список, вычислить новый список, а затем использовать свою функцию, чтобы поместить эту замену в список списков. ИЛИ (и лучше)
  • Создайте более общую функцию, которая вместо взятия нового значения переводит функцию из старого значения в новое:

Пример

replaceNth' :: Int -> (a -> a) -> [a] -> [a]
replaceNth' n f (x:xs)
  | n == 0 = (f x):xs
  | otherwise = x:replace (n-1) f xs

Теперь, чтобы решить вторую проблему:

let ls = [[3,3,3,3,3],[3,3,3,3,3],[3,3,3,3,3]]
in replaceNth' 1 (replaceNth' 3 (const 2)) ls

То есть заменить второй список списком, составленным из четвертого элемента этого списка изаменив то, что когда-либо было на 2.

2 голосов
/ 02 мая 2011

Создайте функцию, которая вместо этого применяет функцию к n-му элементу списка. Тогда вы можете легко получить то, что хотите, составив это с собой и используя const для внутренней замены.

1 голос
/ 02 мая 2011

возможно, это делает то, что вы хотите (применяется к списку списков):

replaceNth 1 (replaceNth 3 4 [3,3,3,3,3])

0 голосов
/ 02 мая 2011

Используя существующее определение:

ghci> let arg = [[3,3,3,3,3],[3,3,3,3,3],[3,3,3,3,3]]
ghci> replaceNth 1 (replaceNth 3 2 (arg !! 1)) arg
[[3,3,3,3,3],[3,3,3,2,3],[3,3,3,3,3]]
ghci> 

Чтобы преобразовать его в функцию:

replaceMthNth m n v arg = replaceNth m (replaceNth n v (arg !! m)) arg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...