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 。可能吗?
最佳答案
以下编译就可以了:
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)
。关于f# - 签名的“.NET”和“OCaml”格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10957700/