gpt4 book ai didi

arrays - 在 F# 接口(interface)中实现 GetSlice 进行切片

转载 作者:行者123 更新时间:2023-12-04 18:59:39 24 4
gpt4 key购买 nike

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

我所做的是以下。我定义了一个接口(interface)如下:

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

这是基于我从规范的第 6.4.7 节中理解的说明。这个想法是,当我有一个 IMatrix命名为 matrix ,我应该可以写
matrix.[1 .. 2, 3 .. 4]

并得到一个 IMatrix 类型的子矩阵.这个想法基本上是, 1 .. 2转换为 Some 1, Some 23 .. 4转换为 Some 3, Some 4由编译器,这四种选项类型被赋予四个参数 GetSlice方法。

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

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

我该如何解决?

最佳答案

我认为编译器只要求参数显式类型为 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]

关于arrays - 在 F# 接口(interface)中实现 GetSlice 进行切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40886482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com