小编Ste*_*RKP的帖子

F#联合案例参数化

我只是看我的代码,并且不确定是否有一种方法可以概括这些代码块:

我遇到的问题是,我对函数范式/ F#相对较新,并且我不确定是否有一种方法可以处理模式匹配/判别以外的联合案例。这个例子可能会问一个问题,如果它们遵循相同的逻辑,为什么它们是不同的情况,答案是我真的试图在一个联合中为域描述目的使用不同的情况。我仍然在尝试创建一些通用模块时寻求平衡,但是将类型安全性用于领域特殊性。在此示例中,我将从通用输入模块绑定此Domain用法的所有可能字段。

本质上,是否有某种方式可以使用“特殊情况”作为参数?如何将其传递/管道输送?

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 …
Run Code Online (Sandbox Code Playgroud)

f# discriminated-union

3
推荐指数
1
解决办法
56
查看次数

F# - 从受歧视联盟中提取/解开预期案例的类型值的最简洁方法?

我当前的 F# 中的整体类型结构和利用率运行得很好。然而,如果我做错了什么或遵循某种反模式,我想得到一些看法。我确实发现自己经常本质上期望特定逻辑中的特定类型,该类型是从更通用的类型中提取出来的,该类型是统一了一堆不同类型的可区分联合,这些类型都遵循公共处理层。

本质上我需要这个函数的特定版本:

'GeneralDiscriminatedUnionType -> 'SpecificCaseType
Run Code Online (Sandbox Code Playgroud)

我发现自己重复了许多类似以下的陈述:

let checkPromptUpdated (PromptUpdated prompt) = prompt
Run Code Online (Sandbox Code Playgroud)

这是我发现的最简单的方法;然而,其中每一个都有一个有效的编译器警告,如果使用与预期不同的类型调用函数,则可能会出现问题。这是公平的,但到目前为止我已经有大约 40 到 50 个这样的了。

所以我开始尝试以下方法,这实际上更好,因为它会引发错误使用的有效异常(两者是相同的):

let checkPromptUpdated input  = match input with | PromptUpdated prompt -> prompt | _ -> invalidOp "Expecting Prompt"    
let checkPromptUpdated = function | PromptUpdated prompt -> prompt | _ -> invalidOp "Expecting Prompt"
Run Code Online (Sandbox Code Playgroud)

然而,这看起来更混乱,我试图在我重新处理这些混乱之前找出是否有人有任何建议。

有没有某种方法可以将这种更广泛的逻辑应用到更通用的函数中,然后让我能够以更干净、更直接和可读的方式编写这个 50 到 100x 的代码?

这个问题只是尝试编写更清晰的代码的问题。

这是一个 DU 的示例,我正在尝试编写函数以便能够从案例中提取特定类型的值:

type StateEvent = 
| PromptUpdated of Prompt
| CorrectAnswerUpdated of CorrectAnswer
| DifficultyUpdated of Difficulty
| TagsUpdated …
Run Code Online (Sandbox Code Playgroud)

f# discriminated-union

2
推荐指数
1
解决办法
185
查看次数

标签 统计

discriminated-union ×2

f# ×2