monomorphising doesn't do inling. When a monomorphising compiler sees the following code:
listmap : (a -> b) -> List a -> List b
listmap fn list =
List.foldl (\a acc -> fn a :: acc) list
|> List.reverse
strs = listmap String.fromInt [ 1, 2, 3 ]
strs = listmap isEven [ 1, 2, 3 ]
it will generate two versions of listmap, one which has the type (Int -> String) -> List Int -> List String and one which has the type (Int -> Bool) -> List Int -> List Bool. It will then use the specialized listmap implementations where it can.
This allows the compiler to specialize code better, because it has precise type information.
monomorphising doesn't do inling. When a monomorphising compiler sees the following code:
it will generate two versions of
listmap
, one which has the type(Int -> String) -> List Int -> List String
and one which has the type(Int -> Bool) -> List Int -> List Bool
. It will then use the specializedlistmap
implementations where it can.This allows the compiler to specialize code better, because it has precise type information.
Oh...I misread that you used "monomorphishing" like as this article explained.
I've published my translation! zenn.dev/mshaka/articles/633027bef...
I appreciate your patience and kindness!