签名的“.NET”和“OCaml”格式

时间:2012-06-09 01:31:58

标签: f#

F#允许签名的“.NET”和“OCaml”格式。如果您养成使用一种风格的习惯,然后找到无法正确格式化所需签名的情况,这可能会令人困惑。考虑一下这段代码,它需要灵活的类型作为输入到foo的函数的输出:

let foo n (bar: int -> #seq<'a>) =
    (fun () -> Vector.ofSeq (bar n))

let foobar n = Array.ofSeq([1..n])

let x = foo 10 foobar

我无法弄清楚如何表达#seq&lt;'a&gt;以OCaml格式。有可能吗?

2 个答案:

答案 0 :(得分:4)

以下编辑很好:

type A<'a>(x) =
    member __.Get : 'a = x
    abstract PairWith : 'b -> ('a * 'b * int)
    default __.PairWith y = x, y, 1

type B<'a>(x) =
    inherit A<'a>(x)
    override __.PairWith y = x, y, 2

let pairAB (x : #A<'a>) y =
    x, x.PairWith y

type 'a X (x) =
    member __.Get : 'a = x
    abstract PairWith : 'b -> ('a * 'b * int)
    default __.PairWith y = x, y, 1

type 'a Y (x) =
    inherit X<'a>(x)
    override __.PairWith y = x, y, 2

let pairXY (x : #('a X)) y =
    x, x.PairWith y

所以你可以猜测(然后用F#Interactive确认)你正在寻找#('a seq)

答案 1 :(得分:1)

我不完全确定你的意思,但我认为你想把类型变量放在类型名称的前面,例如'a #seq

根据语言规范(§5.1.5),从那时起是不可能的:

  

#type形式的类型是具有子类型约束的匿名类型,等同于'a when 'a :> type,其中'a是新类型的推理变量。

所以你可以写下你的类型:'a when 'a :> seq<'b>

编辑:你实际上可以使用#('a seq),但它看起来很尴尬,我怀疑它是你想要的。

EDIT2:没看到Ramon Snir的回答:)。