Haskell中如何不用模式匹配,用getters提取嵌套数据结构字段?
不用模式匹配提取Person中的name的方法
有两种简便方式可以实现不在foo函数里直接使用模式匹配提取name:
1. 用记录语法定义数据类型
修改原数据类型的定义,使用Haskell的记录语法,编译器会自动生成对应的访问器函数:
data Token = Token { tokenName :: String, tokenId :: Int } deriving (Show) data Person = Person { personToken :: Token } deriving (Show)
之后在foo里直接组合访问器即可:
foo :: Person -> String foo p = "hello " ++ tokenName (personToken p)
2. 手动封装访问器函数
如果不想改动原数据类型的定义,可以手动写两个封装了模式匹配的访问器函数,在foo里直接调用:
-- 从Person中取出Token getPersonToken :: Person -> Token getPersonToken (Person t) = t -- 从Token中取出name getTokenName :: Token -> String getTokenName (Token name _) = name foo :: Person -> String foo p = "hello " ++ getTokenName (getPersonToken p)
这种方式下,foo函数本身没有使用模式匹配,把模式匹配的逻辑隐藏在了辅助函数里。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

