(Решено) Я не могу заставить работать фолд OCaml при использовании Core - PullRequest
0 голосов
/ 16 октября 2019

Это происходит в 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
...