代码之家  ›  专栏  ›  技术社区  ›  WHITECOLOR

是否有更好的方法从sum类型中展开记录?

  •  0
  • WHITECOLOR  · 技术社区  · 4 年前

    我有一个带有record param的sum类型,记录具有相同类型的相同属性( tag :: String ),我需要从passed中获取其值 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         
    

    我想知道是否有一种更简单、更不冗长的方法可以做到这一点?

    0 回复  |  直到 4 年前
        1
  •  3
  •   Fyodor Soikin    4 年前

    如果您的所有案例都有这个字段,并且它的语义在所有案例中都是相同的(否则为什么会有一个将它们合并在一起的函数?),那么,一个更干净的设计就是将其从案例中带出来:

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