Haskell自定义数据类型成员访问方法咨询
在Haskell中访问自定义数据类型成员的正确姿势
嘿,我懂你遇到的问题了!你定义了一个带String和两个Int的Info类型,想取出实例里的String成员,但用aylmao . String报错了对吧?
先看看你之前的尝试代码:
Prelude> data Info = Info String Int Int Prelude> aylmao = Info "aylmao" 2 3 Prelude> aylmao . String
报错信息是:
:4:1: error: • Couldn't match expected type ‘b0 -> c’ with actual t...
其实问题出在你用错了运算符——.是Haskell里的函数组合运算符,不是用来访问数据成员的!想取出自定义类型的成员,有几种简单的方法:
方法一:手动写模式匹配函数
你可以专门写一个函数,通过模式匹配解构Info实例,取出需要的String:
getInfoString :: Info -> String getInfoString (Info str _ _) = str -- 下划线表示忽略另外两个Int成员
之后直接调用这个函数就行:
Prelude> getInfoString aylmao "aylmao"
方法二:用记录语法定义数据类型(推荐!)
如果定义类型的时候用记录语法,Haskell会自动帮你生成每个字段的访问器函数,不用自己写:
data Info = Info { infoName :: String, infoVal1 :: Int, infoVal2 :: Int } deriving (Show)
现在你直接用自动生成的infoName函数就能取出String成员了:
Prelude> aylmao = Info { infoName = "aylmao", infoVal1 = 2, infoVal2 = 3 } Prelude> infoName aylmao "aylmao"
而且加了deriving (Show)还能直接打印Info实例,调试起来更方便~
方法三:在GHCi里直接模式匹配提取
如果只是在交互环境里临时取成员,不用写函数,直接用let绑定解构就行:
Prelude> let (Info targetStr _ _) = aylmao Prelude> targetStr "aylmao"
内容的提问来源于stack exchange,提问作者zython
相关产品推荐
相关产品推荐

