Elm新手求助:如何基于含Maybe字段的Req类型实现getsBA函数
解决Elm中Req到Maybe BA的转换问题
你已经搞定了解码JSON到Req类型的关键一步,接下来要把Req转换成Maybe BA其实非常直观,核心就是利用Elm里Maybe类型的组合特性——因为BA要求username和password都是必填的String,只有当Req里的这两个字段都为Just值时,我们才能构建出有效的BA实例,否则就返回Nothing。
先明确一下你提到的类型定义(方便对照):
type alias Req = { username : Maybe String , password : Maybe String -- 其他可选字段... } type alias BA = { username : String , password : String } type alias SBA = Maybe BA
方式一:用Maybe.map2实现(简洁函数式风格)
Elm的Maybe.map2专门用来组合两个Maybe值,正好适配我们的需求:
getsBA : Req -> SBA getsBA req = Maybe.map2 BA req.username req.password
- 原理:
Maybe.map2接受一个二元函数(这里就是BA的构造器,它需要两个String参数),以及两个Maybe值。 - 逻辑:只有当
req.username和req.password都是Just uname和Just pwd时,才会返回Just (BA uname pwd);只要其中一个是Nothing,结果直接是Nothing。
方式二:用case表达式实现(更直观易读)
如果刚接触函数式编程,case表达式的写法可能更容易理解:
getsBA : Req -> SBA getsBA req = case (req.username, req.password) of (Just uname, Just pwd) -> Just (BA uname pwd) _ -> Nothing
- 逻辑:直接匹配两个字段都为
Just的场景,构建BA并包装成Just;其他所有情况(单个Nothing或两个都是Nothing)都返回Nothing。
小提示
如果以后Req中需要加入其他要映射到BA的可选字段,只需要对应调整:比如新增email : Maybe String到Req,同时BA也加email : String,那只需要把Maybe.map2换成Maybe.map3,传入三个Maybe值即可,非常灵活。
内容的提问来源于stack exchange,提问作者Imraan Khan
相关产品推荐
相关产品推荐

