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

Is there better way to unwrap record from sum type?

我有一个带有记录参数的总和类型,记录具有相同类型的相同属性 (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         

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

如果你所有的 case 总是有这个字段,并且它的语义在所有 case 中都是相同的(否则为什么你会有一个将它们合并的函数?),那么一个更简洁的设计是将它从 case 中取出:

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

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