在以下代码中,请注意 get_Zero 的类型约束:
type Wrapper<'t> = { Data : 't[] }
let compute<'t
when 't : (static member get_Zero : unit -> 't)
and 't : (static member (~-) : 't -> 't)
and 't : (static member (+) : 't * 't -> 't)>
(wrapper : Wrapper<'t>) =
wrapper.Data
|> Seq.mapi (fun i value -> (i, value))
|> Seq.sumBy (fun (i, value) ->
if i % 2 = 0 then value
else -value)
尽管我已经有了显式类型约束,但在调用 Seq.sumBy 时仍然收到以下编译器错误:
类型参数缺少约束 'when ^t : (static member
get_Zero : -> ^t)'
有人知道这是怎么回事吗?谢谢。
尝试使下游静态成员约束显式化可能会令人沮丧,而且幸运的是,这很少有必要。只需标记功能即可inline
并让它们被推断出来。
let inline compute (wrapper : Wrapper<_>) =
wrapper.Data
|> Seq.mapi (fun i value -> (i, value))
|> Seq.sumBy (fun (i, value) ->
if i % 2 = 0 then value
else -value)
正确的签名是:
let inline compute<'t
when 't : (static member Zero : 't)
and 't : (static member (~-) : 't -> 't)
and 't : (static member (+) : 't * 't -> 't)>
(您会注意到错误消息中的签名甚至不是有效的语法:when ^t : (static member get_Zero : -> ^t)
。这就是我所说的令人沮丧的一部分。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)