有没有更好的方法从总和类型中解开记录?

问题描述

我有一个带有记录参数的 sum 类型,记录具有相同类型 (tag :: String) 的相同属性,我需要从传递的 T 类型值中获取其值。所以我使用案例模式匹配:

data T = T1 { tag :: String,... } | T2 { tag :: String,...} | T3 {tag :: String,...}

fun :: T -> String
fun t = case t of
        T1 { tag } -> tag
        T2 { tag } -> tag
        T3 { tag } -> tag         

我想知道是否有更简单、更简洁的方法来做到这一点?

解决方法

如果您的所有案例都始终具有此字段,并且其语义在所有案例中都相同(否则为什么您会有一个将它们合并的函数?),那么更简洁的设计就是将其从案例中移除:

type T = { tag :: String,theCase :: TCase }
data TCase = T1 { ... } | T2 { ... } | T3 { ... }

fun :: T -> String
fun = _.tag