3

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

我不知道如何以 OCaml 格式表达 #seq<'a>。是否可以?

4

2 回答 2

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).

于 2012-06-09T07:00:08.010 回答
1

我不完全确定您的意思,但我假设您想将类型变量放在类型名称前面,例如'a #seq.

根据语言规范(§5.1.5),这是不可能的,因为:

表单#type的类型是具有子类型约束的匿名类型,等效于'a when 'a :> type,其中'a是新的类型推断变量。

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

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

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

于 2012-06-09T06:24:54.320 回答