【发布时间】:2013-03-31 21:58:20
【问题描述】:
继续我关于类型级算术的一系列问题,我偶然发现了另一个问题:多态递归函数的返回类型。
这是代码:
module Nat : sig
type z = Z
type 'n s = S of 'n
type ('n) nat =
Zero : (z) nat
| Succ : ('n) nat -> ('n s) nat
val of_int : int -> 'n nat
end = struct
type z = Z
type 'n s = S of 'n
type ( 'n) nat =
Zero : ( z) nat
| Succ : ('n) nat -> ('n s) nat
let rec of_int n : int -> 'n nat = function
0 -> Zero
| n -> Succ (of_int (n - 1))
end
编译产量:
Error: This expression [Succ (of_int (n - 1))] has type 'a s nat
but an expression was expected of type z nat
问题是函数的返回值在第一个模式匹配子句中被零设置为z nat。相反,它应该是类似 'a. '一个纳特?尝试制作添加两个不同 Nat:s 的函数时也会出现此问题。
感谢您的帮助。
【问题讨论】:
标签: recursion ocaml polymorphism