gpt4 book ai didi

F# 类中的 cons 运算符和列表

转载 作者:行者123 更新时间:2023-12-02 09:29:48 24 4
gpt4 key购买 nike

这是我的问题。我有一个非常面向功能的 python 项目...但它基本上是通过类运行的...所以 F# 似乎是我的代码编译版本的理想语言(我想将我的源代码黑盒化... python 代码就放在文件中。不酷)。

在我的 python 类中,我有一个通用容器——一个 python 列表。在给定的实现中,该容器将包含统一长度的数组...

这是我的问题:我需要在初始化后将数组添加到列表中。

将数组添加到类列表中的正确方法是什么?

这是我所拥有的......但它似乎会很慢,因为它会用新副本抛出旧列表(对吧?):

 type myclass() = 
let mutable _training = []
member this.training with get() = _training
and set(value) = _training <- value::_training

但是,这会失败(即使进行了下面建议的编辑),因为编译器声称 set函数是obj with set而不是obj list with set ,尽管它承认 _training<- 左侧的可变 obj 列表在 set 函数中...我被难住了)

执行此操作的正确“F#”方法是什么?

最佳答案

“正确的”F# 方法是根本不使用 myclass。具有单个 getter 和 setter 的类无法为不可变列表提供任何值(value)。

也就是说,由于多种原因,上述代码无法编译:

  1. 类型是用=定义的,而不是:
  2. _training 不受 let 表达式约束。
  3. 如果您想要改变 _training 值,则必须将其声明为 let mutable
  4. 即便如此,get的返回值是obj list,但是set的输入值(即符号 value) 是 obj,因为使用了 cons 运算符 (::)。正如编译器所说,getset 的类型必须相同。

您可以通过解决所有这些问题来使其编译:

type Myclass() =
let mutable _training = []
member this.training with get() = _training
and set(value) = _training <- value

但它不会有任何结果。如果您需要一个列表,请传递一个列表。并不是我们不相信 F# 中的封装,而是properties aren't equivalent to encapsulation anyway ...

顺便说一句,使用 Pascal Case 命名类型是惯用的,所以用 MyClass 而不是 myclass。前导下划线也不常用,因此应该是 training 而不是 _training

关于F# 类中的 cons 运算符和列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34340497/

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