Pass polymorphic function to be applied multiple ways?

Hi All
How can I type a function argument that operates on containers and is applied to multiple containers inside the function:

let fn = (a: (forall 'x. array<'x> => 'x), lst: array<'a>, rst: array<'b>) => (a(lst), b(lst))

I am sure ive seen some talk of this here and some evidence of it in reasonml but cant find the examples here on in docs…

Thanks!
Alex

I believe a GADT will be required here. E.g. Switch on GADT expecting all branches to have same type - #4 by glennsl

This is a limitation of higher-rank polymorphic functions. The OCaml documentation has a section about it here.

The short answer is that this kind of polymorphism is not directly possible, but it can be achieved by wrapping the function in a new type.

@unboxed
type polyFn<'a> = {f: 'a. array<'a> => 'a}

let fn = ({f}, a, b) => (f(a), f(b))

let x = fn({f: a => a[0]}, [1, 2], ["a", "b"])

The @unboxed annotation is not necessary, but it will let the compiler optimize away the record so the output just has the function.

4 Likes

Ahh there it is, of course…
I was definitely looking through your previous posts john.

Thanks again,
Alex

1 Like