在F#接口中实现GetSlice切片

Ale*_*kol 5 arrays f# functional-programming interface multidimensional-array

F#支持"切片表达式",例如对于传统的一维数组,其myArray允许诸如的表达式myArray.[3 .. 5].根据例如F#4.0语言规范(第6.4.7节),这是通过在适当转换参数后调用GetSlice方法来实现的.这也适用于多维数组.但是,我在定义在二维情况下实现它的接口时遇到了一些麻烦.

我所做的是以下内容.我已经定义了一个接口如下:

type IMatrix =

    abstract member GetSlice : ?start1:int * ?end1:int * ?start2:int * ?end2:int -> IMatrix
    abstract member GetSlice : idx1:int * ?end1:int * ?start2:int * ?end2:int -> IMatrix
    abstract member GetSlice : ?start1:int * ?end1:int * idx2:int -> IMatrix
Run Code Online (Sandbox Code Playgroud)

这基于我从说明书第6.4.7节中理解的说明.我的想法是,当我有一个IMatrix名字时matrix,我应该能够写作

matrix.[1 .. 2, 3 .. 4]
Run Code Online (Sandbox Code Playgroud)

并得到一个类型的子矩阵IMatrix.这个想法本质上是由编译器1 .. 2转换Some 1, Some 23 .. 4转换为Some 3, Some 4,并且这四种选项类型都给出了四参数GetSlice方法.

但是,当我在实践中尝试这个时,编译器会报告没有重载与方法'GetSlice'匹配的错误,特别是提到类型'int'与类型'int选项'不兼容.因此在我看来,编译器正确地推断切片概念应该转换为GetSlice调用,但不知何故,参数混淆了.

顺便说一句,如果我在为一个IVector接口实现一维切片时尝试这个,或者在类而不是接口上尝试这个时,我会遇到同样的问题.

我该如何解决?

Tom*_*cek 5

我认为编译器只需要参数明确是类型int option而不是类型的可选参数int.以下类型检查:

type IMatrix =
  abstract member GetSlice : 
    start1:int option * end1:int option * 
    start2:int option * end2:int option -> IMatrix
  abstract member GetSlice : 
    idx1:int * 
    start2:int option * end2:int option -> IMatrix
  abstract member GetSlice : 
    start1:int option * end1:int option * 
    idx2:int -> IMatrix

let m : IMatrix = failwith "!"
m.[1 .. 2, 3 .. 4]
m.[1, 3 .. 4]
m.[1 .. 2, 3]
Run Code Online (Sandbox Code Playgroud)