Эти строки имеют как минимум две синтаксические проблемы:
let chooser inputList = (
for i = 0 to (List.length trueFalseList-1) do
if List.nth trueFalseList i = "True"
then
(List.nth inputList i)::ans
done
List.rev ans;;)
Сначала for .. done
- это одно выражение, а List.rev ans
- другое выражение. Вам нужна точка с запятой (;
) между ними.
Во-вторых, вы должны использовать ;;
только тогда, когда хотите обработать ввод до этой точки. Но здесь, если вы обрабатываете ввод в ;;
, вы пропускаете правильную скобку.
На мой взгляд, вы должны вводить ;;
только на верхнем уровне. Лучший способ думать об этом токене - это указание для верхнего уровня. Это не является частью нормального синтаксиса OCaml.
Это только первые две ошибки. В коде немало других ошибок. Возможно, было бы неплохо добавить одну функцию за раз, чтобы вы могли сосредоточиться на нескольких проблемах одновременно.
Обновление
Среда, которую вы используете, немного сложнее, потому что она имеет кнопку Evaluate , которая запрашивает оценку того, что вы набрали до сих пор. Это делает маркер ;;
гораздо менее полезным.
Было бы неплохо использовать эту среду без использования токена ;;
. Просто нажмите кнопку Evaluate , когда вы хотите оценку.
Основная хитрость заключается в том, что если вы хотите оценить оператор (выражение с единичным значением в OCaml) на внешнем уровне, как, скажем, Printf.printf "hello world\n"
. Обычная идиома, позволяющая избежать ввода ;;
перед этим, состоит в том, чтобы превратить это в объявление, например:
let () = Printf.printf "hello world\n"
Это одна неочевидная идиома, которую люди используют при написании исходного кода (где ;;
почти никогда не появляется в моем опыте).