f#中的扩展运算符

  • 本文关键字:运算符 扩展 f#
  • 更新时间 :
  • 英文 :


免责声明:我是f#新手。

我创建了一个自定义类型,并为其添加了一个函数。我想扩展它,允许使用标准的+运算符进行加法运算(为了简洁,类型被简化了):

type MyInt = {N:int}
let sumMyInt n1 n2 = {N=n1.N + n2.N}
type MyInt with
static member (+)(n1, n2) = sumMyInt n1 n2
let n1 = {N=1}
let n2 = {N=2}
printfn "%O" (n1 + n2)

这工作并打印{N=3}。我想将此操作提升到MyInt的列表,如果我正确理解MSDN文档扩展MyInt list需要扩展方法。所以我写:

open System.Collections.Generic
open System.Runtime.CompilerServices
let sumMyInts = List.map2 sumMyInt
[<Extension>]
type MyIntListExtensions =
[<Extension>]
static member inline (+)(ss1, ss2) = sumMyInts ss1 ss2
[<Extension>]
static member inline SumMyInts (ss1, ss2) = sumMyInts ss1 ss2

let x = sumMyInts ns1 ns2
let y = ns1.SumMyInts ns2
let z = ns1 + ns2

现在xy编译和工作。z拒绝编译错误:

The type 'MyInt list' does not support the operator '+'

最令人惊讶的部分是它编译了:

let z' = ns1.op_Addition ns2

我做错了什么吗?如何定义扩展操作符?

不能在f#中做你想做的事情,参见这个RFC。

可以创建一个全局操作符,实现如下操作:

let inline (@+) (xs: 'a list) (ys: 'a list) =
List.map2 (+) xs ys

> [1; 2] @+ [3; 4]
- ;;
val it : int list = [4; 6]

明确没有在这里显示(+),原因很明显:)。更多关于创建操作符的信息请点击:https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/operator-overloading#creating-new-operators

最新更新