Использование Map.update в OCaml - PullRequest
       3

Использование Map.update в OCaml

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

Я пытаюсь изменить значение ключа на карте, которую я создал в OCaml:

module TestMap = Map.Make(String);;
let m = TestMap.empty;;
let m = TestMap.add "Chris" 1 m ;;
let m = TestMap.add "Julie" 4 m;;

Этот файл компилируется, но когда я пытаюсь обновить значение ключа Julie с помощью:

let m = TestMap.update "Julie" 10 m;;

Я получаю сообщение об ошибке от компилятора:

Error: This expression has type int but an expression was expected of type
         'a option -> 'a option

Я предполагаю, что, возможно, неправильно использую функцию.Я нахожу документацию для Map.update довольно сложной для понимания:

val update : key -> ('a option -> 'a option) -> 'a t -> 'a t

Мой синтаксис или мои аргументы неверны?

1 Ответ

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

Функция обновления работает не так, как вы думаете

key -> ('a option -> 'a option) -> 'a t -> 'a t

Вы видите, что второй аргумент - это функция, которая принимает 'a option и возвращает 'a option, поэтому вы не можете напрямуюобновить с новым значением, а вместо этого передать функцию, которая возвращает новое значение, в соответствии с предыдущим, например:

let m = TestMap.update "Julie" (fun _ -> Some 10) m;;

Это потому, что, как указано в документации, переданный 'a option сообщает вам, было лисопоставление для ключа и возвращенного 'a option позволяет вам изменить его или даже удалить (через None).

Если вам нужно просто обновить сопоставление, вы можете снова использовать Map.add, естьнет необходимости использовать более продвинутый Map.update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...