问题描述
我有一个带有记录参数的 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