gpt4 book ai didi

f# - F# 中的单例区分联合,类型和标签的名称相同

转载 作者:行者123 更新时间:2023-12-02 04:31:36 25 4
gpt4 key购买 nike

我在 F# 文件中有以下代码:

module ORDERS

type OrderId = // TypeName
| OrderId of string // LabelName: same as TypeName!
with
static member getValue (OrderId orderId) =
orderId

在另一个文件中,我可以使用这样的函数:

// This code works.
module Application
open ORDERS

let x = OrderId "1111"
let extractedValue =
x
|> OrderId.getValue

但是,如果我尝试删除“打开的订单”并用它们的完整路径替换代码,我会收到错误消息:

// This code fails.
module Application

// This is OK
let x2 = ORDERS.OrderId "11111"

// This has error!
let extractValue2 =
x2
|> ORDERS.OrderId.getValue

我认为原因是在第二个代码中,F# 无法区分 TypeName "OrderId"和 LabelName "OrderId"

问题:

  1. 为什么删除“open ORDERS”,但指定完整路径会导致代码失败?这两个代码(带“open ORDERS”;不带“open ORDERS”但指定函数全名)不是等价的吗?

附加问题:

  1. 将 TypeName 和 LabelName 重命名为不同的名称以便它们不会相互冲突会更好吗?例如

    module ORDERS
    type OrderIdType = // TypeName
    | OrderIdLabel of string // LabelName: different from TypeName!
    with
    static member getValue (OrderIdLabel orderId) =
    orderId

非常感谢。

最佳答案

您可以通过将静态方法替换为模块级 getOrderIdValue 函数来实现如下所示的工作:

module ORDERS =

type OrderId = // TypeName
| OrderId of string // LabelName: same as TypeName!
with
static member getValue (OrderId orderId) =
orderId

let getOrderIdValue (OrderId orderId) =
orderId

module Application =
open ORDERS

let x = OrderId "1111"
let extractedValue =
x
|> OrderId.getValue

module ApplicationWithoutOpenOrders =

// This is OK
let x2 = ORDERS.OrderId "11111"

// This has error!
let extractValue2 =
x2
|> ORDERS.getOrderIdValue

关于f# - F# 中的单例区分联合,类型和标签的名称相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48179998/

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