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格式。有可能吗?
答案 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的回答:)。