如何泛型转换联合类型为其成员的Maybe类型以过滤目标列表
方案说明
Elm 无运行时类型反射能力,无法完全自动生成联合类型成员的匹配逻辑,但可以通过以下两种方式大幅降低重复代码量,符合 Elm 官方最佳实践。
方案1:极简匿名匹配(适合少量单次使用场景)
无需单独定义asMaybe<Type>系列函数,直接在filterMap中写匿名匹配逻辑,每个类型过滤仅需要修改构造函数即可:
-- 过滤管理员 onlyAdmins : List User -> List ComplicatedAdminRecord onlyAdmins = List.filterMap (\user -> case user of Admin admin -> Just admin ; _ -> Nothing) -- 过滤普通用户 onlyNormalUsers : List User -> List ComplicatedUserRecord onlyNormalUsers = List.filterMap (\user -> case user of NormalUser user -> Just user ; _ -> Nothing)
方案2:统一封装匹配器(适合多场景复用)
把所有匹配逻辑集中在单独的模块统一维护,业务层直接导入使用,新增联合类型成员仅需要在匹配器模块新增3行代码即可,避免业务代码重复:
-- User/Matcher.elm 统一管理所有匹配逻辑 module User.Matcher exposing (asAdmin, asNormalUser) asAdmin : User -> Maybe ComplicatedAdminRecord asAdmin user = case user of Admin admin -> Just admin _ -> Nothing asNormalUser : User -> Maybe ComplicatedUserRecord asNormalUser user = case user of NormalUser user -> Just user _ -> Nothing
业务层使用:
import User.Matcher exposing (..) onlyAdmins = List.filterMap asAdmin users onlyNormalUsers = List.filterMap asNormalUser users
进阶方案(成员数量极多的场景)
如果联合类型成员超过10个,可以通过elm-codegen工具编写脚本自动生成所有匹配器代码,完全省略手动编码工作。
内容的提问来源于stack exchange,提问作者s3cur3
相关产品推荐
相关产品推荐

