Вот что переводчик дает мне:Как ввести `let rec f g = g f` в OCaml?
# let rec f g = g f ;;
Error: This expression has type ('a -> 'b) -> 'c
but an expression was expected of type 'a
The type variable 'a occurs inside ('a -> 'b) -> 'c
Это работает, если я прохожу -rectypes
переводчика:
# let rec f g = g f ;;
val f : ('a -> 'b) -> 'b as 'a = <fun>
Но есть способ, чтобы он хорошо набран не давая возможность ocaml
?
Я не знаю, как комментировать код, потому что тип f
зависит от типа g
, который сам по себе зависит от типа f
.
Для того, чтобы отключите «возникшую» ошибку, которую вы видите, используйте опцию 'rectypes' [требуется] (http://programmers.stackexchange.com/a/215867/103181), поэтому она не отображается, вы можете сделать это в соответствии с унификация типа 'ocaml' без' rectypes'. – ely
Вы хотите иметь эту функцию, потому что она вам нужна, или это вопрос любопытства? Если вам это нужно, возможно, есть лучший способ сделать это. – PatJ
@PatJ: Я пытался воспроизвести '(loop [bindings] ... recur [bindings])' Синтаксис Clojure в OCaml с 'let rec loop bindings body = body bindings loop', но если вы знаете' loop'/'recur' в Clojure, он может быть перенесен на OCaml с рекурсивной функцией и аккумулятором вместо передачи функции обратного вызова. TL; DR: нет, мне это не нужно, это был просто эксперимент. – bfontaine