2014-10-04 3 views
0

Я хочу обменять пункт в списке в унции.Как изменить элемент в списке в Oz?

Итак, допустим, что у меня L = [1 2 3], и я хотел бы, чтобы это было L = [1 4 3].

Как бы это сделать? Я вижу

{List.member X +Ys ?B} 

И другие различные возможные функции на https://mozart.github.io/mozart-v1/doc-1.4.0/base/list.html

Но я не очень понимаю, синтаксис этих выражений. Я очень новичок в Оз.

ответ

0

Если вы хотите обменять определенный элемент с номером N, вы можете просто перебирать список до тех пор, пока не найдете его, а затем замените его и сохраните остальную часть списка на месте. Это было бы что-то вроде

declare 
fun {Swap Xs N Y} 
    case Xs of nil then nil % There is no Nth element, the list doesn't change 
    [] _|Xr then % The _ means we don't care about the value before Xr in the list 
     if N==1 then Y|Xr % Replace _ with Y and append the rest 
     else {Swap Xr N-1 Y} end % Continue to iterate through the list 
    end 
end 

Можно также использовать вспомогательную функцию внутри Swap, так что вы не должны пройти Y вокруг на каждом рекурсивном вызове, но я не хочу утомлять вас деталями, поскольку вы» новичок.