将ML代码转换为F#(高态多态性)



我正在尝试跟进纸上"轻量化更高的多态性"(https://ocamllabs.github.io/higher/higher/lightweight-weight-weight-higher-kinded-kinded-polymormorphism.pdf)我一直坚持将此ML代码转换为F#

type (_,_) arrow =
    Fn_plus : ((int ∗ int), int) arrow
    | Fn_plus_cons : int → ((int ∗ int list), int list) arrow

let apply : type a b. (a, b) arrow ∗ a → b =
    fun (appl, v) → match appl with
    | Fn_plus → let (x, y) = v in x + y
    | Fn_plus_cons n → let (x, l’) = v in x + n :: l’ 

特别是类型的定义感觉就像是一堵大魔术墙。

此示例使用gadts(类似于歧视的工会,单个联合案例可以以不同的方式约束类型的参数),而f#则不可用。值得庆幸的是,这只是对(价值)解关化概念的介绍的一部分,因此我认为这实际上对您关心的论文并不是至关重要的。

顺便说一句,这里显示了用具有更高类型语言的语言编码GADT的一种方法,因此您实际上可以使用"轻巧的高态多态性"方法来编码GADT。

在此处的"简单gadts"部分中展示了另一种简单,更简单的方法,该部分主要简单地转换为f#。但是,请注意那里提到的警告说,Leibniz原理并不完全支持(并查看页面的其他部分,以查看方法的出色扩展,这再次需要更高的类型)。

最新更新