You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何泛型转换联合类型为其成员的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 07:24:04