gpt4 book ai didi

F# 联合案例参数化

转载 作者:行者123 更新时间:2023-12-05 00:32:20 24 4
gpt4 key购买 nike

我只是在看我的代码,我不确定是否有办法概括这些代码块:

我遇到的问题是我对函数式范例/F# 比较陌生,我不确定是否有一种方法可以处理模式匹配/辨别之外的联合案例。这个例子可能会问这样一个问题,如果它们遵循相同的逻辑,为什么它们是不同的情况,答案是我真的试图在联合中使用不同的情况来进行域描述;我仍在努力寻找平衡点,以创建一些通用模块为目标,但利用类型安全来处理领域的特殊性。在此示例中,我从通用输入模块绑定(bind)此域用法的所有可能字段。

本质上,是否有某种方法可以将特例用作参数?它将如何传递/通过管道输入?

let updateUserRegistrationInputFieldValue changeValue fieldValue =
match changeValue with
| ID cv -> match fieldValue with | ID _ -> ID cv | _ -> fieldValue
| Name cv -> match fieldValue with | Name _ -> Name cv | _ -> fieldValue
| Email cv -> match fieldValue with | Email _ -> Email cv | _ -> fieldValue
| Phone cv -> match fieldValue with | Phone _ -> Phone cv | _ -> fieldValue

let validateUserRegistrationInputField requirementsSelector fieldValue =
match fieldValue with
| ID fv -> validateInputValue fv (requirementsSelector fv)
| Name fv -> validateInputValue fv (requirementsSelector fv)
| Email fv -> validateInputValue fv (requirementsSelector fv)
| Phone fv -> validateInputValue fv (requirementsSelector fv)

这并不重要,因为它有效,我也相信在这些领域特定功能中对字段的额外描述有一定的值(value)。但是,我只是想看看是否有比我目前正在做的更好的做法。目标是潜在地允许我构建一些更通用的函数,然后我可以将域描述更专门地保留在 DU 类型定义中,但与通用函数一起使用。

感谢任何想法或意见...

更新:修正了一些拼写错误,并进一步阐明了我的目标。还添加了初始示例中使用的 DU 定义。

type UserRegistrationInputValue =
| ID of InputStringValue
| Name of InputStringValue
| Email of InputStringValue
| Phone of InputStringValue

此类型用于第一个函数中的 'changeValue' 和 'fieldValue' 参数,而它是第二个函数中的 fieldValue。 (requirementsSelector 是一个以这个 DU Type 为参数的函数)

DU 的定义说明了我要实现的领域特异性级别,同时依赖于我的通用模块进行处理/行为。示例中命名/定义的函数保存在我的域中,因为它们使用域特定类型;但是,我看到,在我当前的类(class)中,针对不同的域定义重复了很多此代码...

最佳答案

您可以在模式匹配之前将多个项目放入一个元组中并同时匹配它们。这为您提供了一个“AND”模式匹配:

let updateUserRegistrationInputFieldValue changeValue fieldValue =
match changeValue, fieldValue with
| ID cv, ID _ -> ID cv // matches when changeValue is ID **AND** fieldValue is ID
| Name cv, Name _ -> Name cv
| Email cv, Email _ -> Email cv
| Phone cv, Email _ -> Phone cv
| _ -> fieldValue

您可以将垂直管道 | 作为“OR”模式匹配放在模式匹配中:

let validateUserRegistrationInputField requirementsSelector fieldValue =
match fieldValue with
| ID fv | Name fv | Email fv | Phone fv ->
validateInputValue fv (requirementsSelector fv)

如果您这样做,那么所有被“或”运算的模式都需要绑定(bind)具有相同名称和类型的值。在这种情况下,对于所有 DU 情况,fv 必须是同一类型。

关于F# 联合案例参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58601604/

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