You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:13:24