gpt4 book ai didi

F# SAFE 如何处理消息 DU 变体的增长?

转载 作者:行者123 更新时间:2023-12-04 07:18:01 26 4
gpt4 key购买 nike

在 F# SAFE 堆栈中有一个 DU 类型,它定义了在服务器和客户端之间流动的所有类型的消息。在示例应用程序中,有 <10 个,我查看了提供的示例 - 所有这些都没有很多可能的类型。但是如果应用程序不小怎么办——DU 中会有数百种类型;这将变得难以维护。所以我决定将这个类型划分为子类型,并将逻辑放在相应的文件中。

这是我的简化类型:

 type Msg2 =
| LoginMsg of LoginState
| RegisterMsg of RegisterState
| ViewUpdateMsg of ViewUpdateState

登录状态在另一个文件中定义:

 type LoginState =
| Login
| LogInResult of LoginResult

登录模块与登录一起使用:

let workWithLogin (model: Model) (msg: LoginState) (todosApi: ITodosApi) : Model * Cmd<LoginState> =
match msg with
| LoginState.Login ->
let result =
Cmd.OfAsync.perform todosApi.login model.InputData LoginState.LogInResult

model, result
| LoginState.LogInResult data ->
{ model with
LoginState = getVal data.Message
Token = data.Token },
Cmd.none

注意它返回 Model * Cmd<LoginState> .

现在我需要修复我的更新功能:

let update2 (msg: Msg2) (model: Model) : Model * Cmd<Msg2> =
match msg with
| LoginMsg n ->
let ret = workWithLogin model n todosApi
model, snd ret
| RegisterMsg n -> ...
| ViewUpdateMsg n -> ...

这里的问题是我得到 Cmd<LoginState>来自登录模块,需要将其转换为 Cmd<Msg2>不知何故。 enter image description here所以我要么需要创建新的 Msg2输入或转换 DU 变体 LoginMsg of LoginStateMsg2 .我不明白如何获得 LogInResult数据来自 Cmd<LoginState> .

我该如何解决这个问题?大项目中消息类型多的问题是如何解决的?

最佳答案

您在“子”消息中所做的包装是正确的方法,您可能应该对模型做同样的事情 - 即让 Login有自己的模型。在不同的 Cmd<'msg> 之间转换有一个Cmd.map .在您的情况下,您可以:

let update2 (msg: Msg2) (model: Model) : Model * Cmd<Msg2> =
match msg with
| LoginMsg n ->
let (loginModel, loginCmd) = workWithLogin model n todosApi
{ model with Login = loginModel }, Cmd.map LoginMsg loginCmd

可以看到Cmd的一些API说明这里:https://elmish.github.io/elmish/cmd.html

关于F# SAFE 如何处理消息 DU 变体的增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68677136/

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