【问题标题】:Operator Overloading with seq<'T>使用 seq<'T> 重载运算符
【发布时间】:2017-03-29 16:23:30
【问题描述】:

在我正在试验的一个项目中,我不断地增加序列元素。我想创建一个这样的运算符:

let (.*) (a:seq<'T>) (b:seq<'T>) = Seq.map2 (*) a b

但是,在 FSI 中它返回:

val ( .* ) : a:seq<int> -> b:seq<int> -> seq<int>

以下失败:

  seq [1.0;2.0] .* seq [3.0;4.0];;
  -----^^^

stdin(16,6): error FS0001: This expression was expected to have type
    int    
but here has type
    float 

如何让操作符在泛型 seq 上工作(前提是 'T 支持乘法)?

【问题讨论】:

    标签: f# operator-overloading


    【解决方案1】:

    您需要将inline 关键字添加到您的运算符声明中,以便可以在编译时解决正确的重载:

    let inline (.*) (a:seq<'T>) (b:seq<'T>) = Seq.map2 (*) a b
    
    val inline ( .* ) : a:seq< ^T> -> b:seq< ^T> -> seq< ^a> when  ^T :  (static member ( * ) :  ^T *  ^T ->  ^a)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 2016-11-05
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      相关资源
      最近更新 更多