Для этого конкретного сценария я бы просто сопоставил шаблон в списке, связал части, которые я хочу сохранить, с переменными, а затем восстановил бы его с моим значением замены:
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"]