Skip to content
This repository was archived by the owner on Nov 23, 2022. It is now read-only.
This repository was archived by the owner on Nov 23, 2022. It is now read-only.

Support default implementations #1

@coord-e

Description

@coord-e

Problem

an example in mlx1:

 class<T> Num {
   zero :: T,
   sub :: T -> T -> T,
   neg :: T -> T = sub zero
 } in
 impl Num for Int {
   zero = 0,
   sub x y = x - y
 } in
 neg 1

direct translation (mlx1-like syntax):

 type Num = ΛT. constraint numD (T, T -> T -> T, T -> T) in
 overload (∀'a. Num 'a) in
 let zero = numD#0 in
 let sub = numD#1 in
 let neg = numD#2 in
 instance (Num Int) = (0, sub_int, sub zero) in
 neg 1

It is possible (by adding the instance itself to the context in translation of rhs of instance) to type and translate this example to OCaml, however, the resulting translation cannot be compiled because a value recursion happens in the dictionary for Num Int.

A possible translation is shown below. Here, numD_37 is occurred in the rhs of its definition.

let zero = (fun numD_22 -> fst3 (numD_22)) in
let sub = (fun numD_29 -> snd3 (numD_29)) in
let neg = (fun numD_36 -> thd3 (numD_36)) in
let numD_37 = (0, sub_int, sub (numD_37) (zero (numD_37))) in
neg (numD_37) (1)

Possible solution

Using lazy evaluation:

let zero = (fun numD_22 -> fst3 (numD_22)) in
let sub = (fun numD_29 -> snd3 (numD_29)) in
let neg = (fun numD_36 -> Lazy.force (thd3 (numD_36))) in
let rec numD_37 = (0, sub_int, lazy (sub (numD_37) (zero (numD_37)))) in
print_int (neg (numD_37) (1))

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions