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 2
并3 .. 4
转换为Some 3, Some 4
,并且这四种选项类型都给出了四参数GetSlice
方法.
但是,当我在实践中尝试这个时,编译器会报告没有重载与方法'GetSlice'匹配的错误,特别是提到类型'int'与类型'int选项'不兼容.因此在我看来,编译器正确地推断切片概念应该转换为GetSlice调用,但不知何故,参数混淆了.
顺便说一句,如果我在为一个IVector接口实现一维切片时尝试这个,或者在类而不是接口上尝试这个时,我会遇到同样的问题.
我该如何解决?
我认为编译器只需要参数明确是类型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)