gpt4 book ai didi

F#:将顶级函数转换为成员方法的优点?

转载 作者:行者123 更新时间:2023-12-04 16:41:34 25 4
gpt4 key购买 nike

早些时候,我要求对我的第一个 F# 项目提供一些反馈。由于范围太大,在结束问题之前,有人好心地查看了它并留下了一些反馈。

他们提到的一件事是指出我有许多常规函数可以转换为我的数据类型的方法。我尽职尽责地经历了改变,比如

let getDecisions hand =
let (/=/) card1 card2 = matchValue card1 = matchValue card2
let canSplit() =
let isPair() =
match hand.Cards with
| card1 :: card2 :: [] when card1 /=/ card2 -> true
| _ -> false
not (hasState Splitting hand) && isPair()
let decisions = [Hit; Stand]
let split = if canSplit() then [Split] else []
let doubleDown = if hasState Initial hand then [DoubleDown] else []
decisions @ split @ doubleDown

对此:
type Hand
// ...stuff...
member hand.GetDecisions =
let (/=/) (c1 : Card) (c2 : Card) = c1.MatchValue = c2.MatchValue
let canSplit() =
let isPair() =
match hand.Cards with
| card1 :: card2 :: [] when card1 /=/ card2 -> true
| _ -> false
not (hand.HasState Splitting) && isPair()
let decisions = [Hit; Stand]
let split = if canSplit() then [Split] else []
let doubleDown = if hand.HasState Initial then [DoubleDown] else []
decisions @ split @ doubleDown

现在,我不怀疑我是个白痴,但除了(我猜)使 C# 互操作更容易之外,这对我有什么好处?具体来说,我找到了一对 显示 优点,不计算转换的额外工作(我不会计算,因为我想我本来可以这样做,尽管这会使使用 F# Interactive 更加痛苦)。一方面,我现在不再能够轻松地使用“流水线”功能。我不得不去改变 some |> chained |> calls(some |> chained).Calls等等,它似乎让我的类型系统更笨了——而在我的原始版本中,我的程序不需要类型注释,在很大程度上转换为成员方法之后,我得到了一堆关于查找不确定的错误,我必须去添加类型注释(上面的 (/=/) 中有一个例子)。

我希望我没有过于怀疑,因为我很欣赏我收到的建议,并且编写惯用的代码对我很重要。我只是好奇为什么成语是这样的:)

谢谢!

最佳答案

我在 F# 编程中使用的一种做法是在两个地方都使用代码。

实际的实现很自然的放在一个模块中:

module Hand = 
let getDecisions hand =
let (/=/) card1 card2 = matchValue card1 = matchValue card2
...

并在成员函数/属性中给出一个“链接”:
type Hand
member this.GetDecisions = Hand.getDecisions this

这种做法通常也用于其他 F# 库,例如powerpack 中的矩阵和向量实现 matrix.fs。

在实践中,并不是每个函数都应该放在这两个地方。最终的决定应该基于领域知识。

关于顶层,做法是将功能放入模块中,必要时将其中一些放在顶层。例如。在 F# PowerPack 中, Matrix<'T>位于命名空间 Microsoft.FSharp.Math .在顶层做一个矩阵构造函数的快捷方式很方便,这样用户就可以直接构造一个矩阵,而无需打开命名空间:
[<AutoOpen>]
module MatrixTopLevelOperators =
let matrix ll = Microsoft.FSharp.Math.Matrix.ofSeq ll

关于F#:将顶级函数转换为成员方法的优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2982644/

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