我正在构建一个工作日志应用程序,该应用程序首先显示我可以选择的项目列表,然后在选择一个项目时,您会得到其他按钮的集合,以记录与该选定项目相关的数据。
我决定在模型中添加一个selected_project : Maybe Int
(项目使用整数ID进行键控),例如,如果选择了项目2,则将填充Just 2
。
选择项目时出现的按钮会发送诸如AddMinutes 10
之类的消息(即,将10分钟的工作记录到所选项目中)。
很显然,仅当选择了一个项目时,更新功能才会接收这些类型的消息之一,但是我仍然必须继续检查selected_project
是Just p
。
有什么办法可以避免这种情况?
我的一个主意是让按钮发送一条包含项目ID的消息,例如AddMinutes 2 10
(即,将10分钟的工作记录到项目2中)。在某种程度上,这可行,但是我得到了一个重复-Just 2
中的model.selected_project
和按钮发出的AddMinutes 2 ...
消息。
正如Simon所言,反复检查model.selected_project
是Just p
有其好处:该模型与UI的分离度相对较高。例如,可能会有其他UI方式来更新项目,而您可能不需要先选择一个项目。
答案 0 :(得分:0)
为避免每次需要使用将Maybe
“包装”的值都可用的上下文的函数时,都不必检查Maybe
。该函数为Maybe.map
。
对于您来说,要处理AddMinutes Int
消息,您可以简单地调用:Maybe.map (functionWhichAddsMinutes minutes) model.selected_project
。
很明显,由于您必须生成模型,因此还有很多其他功能,但是要点是,如果Maybe.map
中的值可用,则可以使用Maybe
来执行操作。要处理Maybe.Nothing
情况,可以使用Maybe.withDefault
。
最后,这比使用case表达式更好吗?也许,也许不是(双关语意)。
我个人使用了随消息一起提供ID的技术,我对结果感到满意。