То же самое, пусть связывание приводит к разным результатам компиляции - PullRequest
0 голосов
/ 01 марта 2019
type 'a tree =
    | Leaf of 'a
    | Node of 'a * 'a tree * 'a tree 

let rec foldtree init op = function
    | Leaf c -> op c init init
    | Node (c, l, r) -> op c (foldtree init op l) (foldtree init op r)

let size' = foldtree 0 (fun _ l r -> 1 + l + r)  (* this compiles fine *)
let size'' = foldtree 0 (fun _ l r -> 1 + l + r) (* this doesn't *)

В приведенном выше коде OCaml определения size' и size'' идентичны, но последнее вызывает ошибку компиляции:

Error: The type of this expression, '_weak1 tree -> int,
       contains type variables that cannot be generalized

1 Ответ

0 голосов
/ 01 марта 2019

Они оба не должны компилироваться, так как оба содержат переменные слабого типа.Однако за один раз компилятор будет сообщать только об одной фатальной ошибке.

Кстати, вы обычно решаете эту проблему с помощью eta-extension:

let size tree = foldtree 0 (fun _ l r -> 1 + l + r) tree
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...