簡體   English   中英

F# - 從有區別的聯合中提取/解包預期案例的類型值的最簡潔方法?

[英]F# - Cleanest way to Extract/Unwrap an Expected Case's Typed Value from Discriminated Union?

我當前的 F# 中的整體類型結構和利用率運行良好。 但是,如果我做錯了什么或遵循某種反模式,我想獲得一些觀點。 我確實發現自己經常從本質上期待一種特定類型的特定邏輯,該特定類型是從一個更通用的類型中提取出來的,該類型是一個可區分的聯合,它統一了一堆不同的類型,這些類型都遵循公共處理層。

基本上我需要這個 function 的特定版本:

'GeneralDiscriminatedUnionType -> 'SpecificCaseType

我發現自己重復了許多類似以下的陳述:

let checkPromptUpdated (PromptUpdated prompt) = prompt

這是我發現的最簡單的方法; 然而,每一個都有一個有效的編譯器警告,如果 function 被調用的類型與預期的不同,則可能會出現問題。 這是公平的,但到目前為止我有 40 到 50 個。

所以我開始嘗試以下方法,這實際上更好,因為它會引發一個使用不正確的有效異常(兩者都是相同的):

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

但是,這看起來更混亂,我試圖找出是否有人在我做這種混亂之前有任何建議。

有什么方法可以將這種更廣泛的邏輯應用到更通用的 function 上,然后可以讓我以更清晰、更直接和可讀的方式編寫 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 function 僅適用於PromptUpdated情況下的事件,那么我認為最好的設計是 function 應該只采用Prompt類型的值(而不是StateEvent類型的值)作為參數:

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

當然,這意味着模式匹配將從這個 function 移動到調用它的 function - 或者進一步 - 到您實際接收StateEvent並且也需要處理所有其他情況的地方。 但這正是您想要的——一旦您對事件進行模式匹配,您就可以使用更具體的類型,例如Prompt

這對我有用

let (TypeUWantToExtractFrom unwrappedValue) = wrappedValue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM