2014-01-18 3 views
1

Я новичок в OCaml и пытаюсь узнать, как обновить словарь и справиться с if/else условностями.
Я написал следующий код, чтобы проверить, есть ли в словаре какой-то ключ. Если нет, добавьте значение по умолчанию для этого ключа. Наконец распечатайте его.Обновление словаря OCaml

module MyUsers = Map.Make(String) 
let myGraph = MyUsers.empty;; 
let myGraph = MyUsers.add "test" "preset" myGraph in 
try 
    let mapped = MyUsers.find "test" myGraph 
with 
    Not_found -> let myGraph = MyUsers.add "test" "default" myGraph in 
Printf.printf "value for the key is now %s\n" (MyUsers.find "test" myGraph) 

Сообщение об ошибке У меня сейчас syntax error for line 6: with Что здесь не так? Также, когда использовать in; или ;;?
Я сделал некоторые поисковые запросы Google и понял, что in, кажется, определяет некоторые области до следующего ;;. Но это все еще очень расплывчато для меня. Не могли бы вы объяснить это более четко?

ответ

2

Ваша непосредственная проблема заключается в том, что за исключением верхнего уровня, let должен следовать in. Выражение выглядит как letпеременная=ВЫРАЖЕНИЕ1inВЫРАЖЕНИЕ2. Идея состоит в том, что данная переменная привязана к значению expression1 в теле expression2. У вас есть let без in.

Трудно ответить на ваш более общий вопрос. Легче работать с определенным кодом и конкретным вопросом.

Однако точка с запятой ; используется для разделения двух значений, которые вы хотите оценить последовательно. Первый должен иметь тип unit (это означает, что он не имеет полезного значения).

На мой взгляд, двойная точка с запятой ;; используется только на верхнем уровне, чтобы сообщить интерпретатору, что вы набрали текст, и что он должен оценить то, что вы дали ему до сих пор. Некоторые люди используют ;; в действительном коде OCaml, но я этого не делаю.

Ваш код указывает на то, что вы решительно думаете о картах OCaml. Карты OCaml неизменяемы; то есть вы не можете изменить значение карты. Вы можете создавать только новую карту с различным содержимым, чем старое.

+0

Спасибо за ваш ответ. Будет ли 'let myDict = MyUsers.add" test "" test2 "myDict in" обновить словарь myDict? – Ra1nWarden

+0

Нет, ничего не обновит словарь, как я уже сказал :-) Словари неизменны. Это выражение создает новый словарь, который имеет то же имя, что и старый. –

+0

Я вижу, но это оригинальная, переписанная, поскольку у них одно и то же имя? – Ra1nWarden

Смежные вопросы