Это происходит в utop, и об ошибках также сообщается при редактировании исходного файла с использованием merlin.
Я полагал, что когда не используется Core, List.fold_left работает должным образом:
utop # List.fold_left;;
- : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a = <fun>
utop # List.fold_left (fun acc x -> acc + x) 0 [0;1;2] ;;
- : int = 3
Но все меняется, когда я использую Core:
utop # open Core;;
utop # List.fold_left;;
- : 'a sexp_list -> init:'b -> f:('b -> 'a -> 'b) -> 'b = <fun>
Я не понимаю всех изменений в сигнатуре типа, но, по крайней мере, он ожидает аргументы в другом порядке. Но, когда я пытаюсь это сделать, я получаю странный результат, которого я не понимаю:
utop # List.fold_left [0;1;2] 0 (fun acc x -> acc + x);;
- : init:(int -> (int -> int -> int) -> '_weak1) ->
f:((int -> (int -> int -> int) -> '_weak1) ->
int -> int -> (int -> int -> int) -> '_weak1) ->
'_weak1
= <fun>
Я новичок в языке и не могу понять, что-то не так в моей настройке, или если яЯ неправильно понимаю что-то о том, как складывается Джанестрит.
РЕДАКТИРОВАТЬ: Reddit победил меня в этом. Версия ядра принимает помеченные аргументы, мне нужно было пометить этот аккумулятор и начальное значение. Правильно это:
utop # List.fold_left [0;1;2] ~init:0 ~f:(fun acc x -> acc + x);;
- : int = 3