Это не считается мутацией, но похоже на то, что вы могли бы сделать, если бы они у вас были, и, вероятно, не будет работать, в зависимости от того, что вы делаете.Мутации требуют ссылок , они сделаны с ref
и на них отменены ссылки с !
.Так что просто держись подальше от них.: -)
Вы делаете что-то, что принесет мало пользы:
let
val count = 0
in
...
end
свяжет count
с 0, но никогда не вызовет count
иметь любую другую ценность;Я предполагаю, что вы хотите в конечном итоге увеличить count
.Если бы это была ссылка, val count = ref 0
, вы могли бы увеличить ее, выполнив count := !count + 1
, но, поскольку это не так, вы должны сделать count
переменной некоторой функции для ее изменения.
Дляпример:
fun count_4s ([], count) = count
| count_4s (x::xs, count) = count_4s (xs, if x = 4 then count + 1 else count)
В каждом вызове count
является константой, но в каждом последующем, рекурсивном вызове это, возможно, увеличивается.
Эта функция g должна получить тип unit -> int функция в качестве первого аргумента.
...
g (fn () => count + 1) (fn y => 1) p
...
[...] Но все равно это выглядит неаккуратно.
Предполагая, что первые аргументы g
не имеют побочных эффектов и не генерируют исключений и не зацикливаются вечно, все, что они могут сделать, это возвращать одно и то же при каждом вызове.Это делает их довольно скучными.Обычно функции, которые либо принимают в качестве ввода, либо возвращают () : unit
, делают что-то еще, например, читают или пишут из внешнего по отношению к программе источника.
Я бы не назвал это небрежным.Просто немного странно, не зная контекста.