F# - 从可区分联合中提取/解包预期案例类型值的最简洁方法?

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

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

'GeneralDiscriminatedUnionType -> 'SpecificCaseType

我发现自己重复了很多如下陈述:

let checkPromptUpdated (PromptUpdated prompt) = prompt

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

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

let checkPromptUpdated input  = match input with | PromptUpdated prompt -> prompt | _ -> invalidOp "Expecting Prompt"    
let checkPromptUpdated = function | PromptUpdated prompt -> prompt | _ -> invalidOp "Expecting Prompt"

但是,这看起来很困惑,我正在尝试找出是否有人在我重新开始这种困惑之前有任何建议。

有没有什么方法可以将这种更广泛的逻辑应用到更通用的函数中,然后可以让我以更清晰、更直接和可读的方式编写这个 50 到 100 倍的函数?

这个问题只是尝试编写更简洁的代码。

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

type StateEvent = 
| PromptUpdated of Prompt
| CorrectAnswerUpdated of CorrectAnswer
| DifficultyUpdated of Difficulty
| TagsUpdated of Tag list
| NotesUpdated of Notes
| AuthorUpdated of Author

最佳答案

如果 checkPromptUpdated 函数仅适用于属于 PromptUpdated 情况的事件,那么我认为最好的设计是该函数应该只采用类型的值Prompt(而不是 StateEvent 类型的值)作为参数:

let checkPromptUpdated prompt = 
  // do whatever checks you need using 'prompt'

当然,这意味着模式匹配将从该函数转移到调用它的函数 - 或者更进一步 - 转移到您实际接收 StateEvent 并需要处理所有其他事件的地方案件太。但这正是您想要的 - 一旦您对事件进行了模式匹配,您就可以使用更具体的类型,例如 Prompt

https://stackoverflow.com/questions/70192101/

相关文章:

python - 是否有一个 Python 函数可以检查任何列表元素是否属于特定数据类型?

javascript - Firebase 9 和 ref 函数与 Vue 组合

java - 响应中未显示 Spring Boot 验证错误消息

c++ - OpenGL 减慢 5k 点

python - 如何删除 selenium python 中的元素

r - 使用具有功能真/假值的 dplyr 的 if_else 函数

java - 设计模式问题: removing overuse of boolean functio

c++ - 将 C 识别的指针类型定义为内部 C++ 类

node.js - 如何使用 Node.js 从 Supabase 存储中保存文件(将 blob 转

r - 使用管道 %>% 在 R 中创建日期序列