将ML代码转换为F#(更高通道的多态性)

时间:2016-12-06 13:17:48

标签: types f# ml higher-kinded-types

我正在尝试跟进论文"轻量级高通道多态性" (https://ocamllabs.github.io/higher/lightweight-higher-kinded-polymorphism.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’ 

特别是类型定义感觉就像一个巨大的魔力墙。

1 个答案:

答案 0 :(得分:5)

此示例使用GADT(类似于有区别的联合,其中各个联合案例可以以不同方式约束类型的参数),这在F#中不可用。值得庆幸的是,这只是对(价值)去功能化概念的介绍的一部分,所以我认为这对你关心的论文部分并不重要。

顺便说一句,在here中显示了一种用高级类型语言编码GADT的方法,因此您可以使用“轻量级高级多态”方法对GADT进行编码。

另一种更简单的方法在“简单GADT”部分here中进行了演示,该部分主要是直接转换为F#。但是,请注意那里提到的警告,莱布尼兹原则并不完全支持(并且请查看页面的其他部分,以查看方法的优越扩展,这又需要更高的种类)。