gpt4 book ai didi

f# - 创建大型 F# 记录的值的最简单方法是什么?

转载 作者:行者123 更新时间:2023-12-05 01:14:59 25 4
gpt4 key购买 nike

我正在学习 F#,我想知道我是否以正确的方式接近它。我创建了一个包含 6 个标签的记录类型,但它可以轻松增长到 10+ 个标签。 我应该如何设计它的构造函数? 由于记录值是不可变的,我认为我应该一口气创建。在构造值时,构造函数中的每个参数都映射到一个标签。但是,这感觉不对。

例如:

module Deal =
open System

type T = {
Title : string;
Description: string;
NumberOfVotes: int;
NumberOfComments: int;
DateCreated: DateTime;
ImageUrl: string;
}


let Create (title:string) (desc:string) (numberOfVotes:int) (numberOfComments:int) (dateCreated: DateTime) (imageUrl:string) =
{
Title = title;
Description = desc;
NumberOfVotes = numberOfVotes;
NumberOfComments = numberOfComments;
DateCreated = dateCreated;
ImageUrl = imageUrl;
}

我不认为构造函数随着更多标签添加到记录而很好地扩展。

有没有更好的解决方案?

最佳答案

F# for fun and profit 示例中,存储的电子邮件地址是一个字符串,并且它是一个包装类型(使用了可区分的联合)。您似乎没有包装器类型。这就是我将如何根据您的情况调整示例:

open System

type Deal =
{ Title : string; Description: string; NumberOfVotes: int
NumberOfComments: int; DateCreated: DateTime; ImageUrl: string }

module Deal =
type ValidDeal =
private ValidDeal of Deal // Note the `private` on the case constructor

let isValid deal = true // Add implementation

let create deal =
if isValid deal then Some (ValidDeal deal)
else None

let (|ValidDeal|) (ValidDeal deal) = deal // This is an active pattern

open Deal
let f (ValidDeal d) = d // Use the active pattern to access the Deal itself.

let g d = ValidDeal d // Compile error. The ValidDeal union case constructor is private

请注意,ValidDeal 联合案例构造函数是 Deal 模块私有(private)的,该模块还包含 isValid 函数。所以这个模块可以完全控制交易的验证。此模块之外的任何代码都必须使用 Deal.create 来创建有效的交易,如果任何函数接收到 ValidDeal,则有某种编译时有效性保证。

关于f# - 创建大型 F# 记录的值的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46750743/

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