Обновление определенного элемента в списке - PullRequest
0 голосов
/ 12 сентября 2018

С учетом списка вязов вроде:

twoDimensionalList =
    [ [ 'U', 'U', ' ' ]
    , [ ' ', ' ', ' ' ]
    , [ ' ', ' ', ' ' ]
    ]

Как я могу обновить ' ' в первом ряду с 'U' в списке Вязов? Я не хочу использовать массив, я хочу выяснить, как сделать это со списком. Я уже сделал конвертировать список в массив и использовать набор. Я пытаюсь узнать, как я обновлю определенный элемент списка в этот раз.

Я начал думать о том, как я могу это сделать, но просто не могу туда добраться:

row1 =
   take 0 twoDimensionalList

row1Updated =
   indexedMap \i row1 -> if i == 2 then --somehow update this item in the map with 'U'

1 Ответ

0 голосов
/ 12 сентября 2018

Для этого конкретного сценария я бы просто сопоставил шаблон в списке, связал части, которые я хочу сохранить, с переменными, а затем восстановил бы его с моим значением замены:

case twoDimensionalList of
    [ a, b, _ ] :: tail ->
        [ a, b, 'U' ] :: tail

    _ ->
        twoDimensionalList

По существу, оператор :: (называемый "cons") будет сопоставлять или связывать первый элемент (называемый "head") слева от него, а остальную часть списка ("tail") - справа. , Так что "a" :: ["b", "c"] будет соответствовать списку ["a", "b", "c"].

Синтаксис литерала списка ([...]) в шаблоне будет соответствовать списку точно такого размера. Таким образом, [a, b, _] :: tail будет сопоставлять список с первым ("головным") элементом, который сам будет трехэлементным списком, где первые два элемента связаны с переменными a и b и третьим элементом, который мы ' собирается заменить, игнорируется. Остальная часть внешнего списка будет привязана к tail.

Затем список реконструируется с использованием почти того же синтаксиса. Я уверен, что вы знакомы с синтаксисом литерала списка, и оператор cons (::) работает аналогично форме шаблона, добавляя элемент слева в список справа, например, "a" :: ["b", "c"] вернет список ["a", "b", "c"]

...