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

Haskell中如何创建包含字符串与整数的多类型列表?

在Haskell中创建包含字符串与整数的混合类型列表

嘿,这个问题问到点子上了!Haskell是强类型语言,普通的列表(比如[Int]或者[String])只能装同一种类型的元素,但我们有几种优雅的方式实现混合类型列表,下面给你拆解:

方法1:自定义代数数据类型(最推荐)

这是最灵活、可读性最高的方案,我们可以直接定义一个能容纳字符串或整数的类型:

-- 定义数据类型:要么是字符串(Str构造器),要么是整数(IntVal构造器)
data StringOrInt = Str String | IntVal Int deriving (Show)

-- 创建混合类型列表
mixedList :: [StringOrInt]
mixedList = [Str "你好", IntVal 42, Str "Haskell", IntVal 100]

deriving (Show)是为了让这个类型能被打印出来,方便调试。如果要处理列表里的元素,用模式匹配就能轻松区分:

-- 处理单个元素的函数
processItem :: StringOrInt -> String
processItem (Str s) = "字符串: " ++ s
processItem (IntVal n) = "整数: " ++ show n

-- 批量处理整个列表
processMixedList :: [StringOrInt] -> [String]
processMixedList = map processItem

调用processMixedList mixedList,就能得到每个元素的处理结果啦。

方法2:使用标准库的Either类型

如果只是临时需要两种类型的混合,不用自定义类型,直接用Haskell标准库自带的Either就行:

-- Either String Int 表示元素要么是Left包裹的String,要么是Right包裹的Int
quickMixedList :: [Either String Int]
quickMixedList = [Left "函数式编程", Right 2024, Left "强类型", Right 123]

处理的时候同样用模式匹配:

handleEitherItem :: Either String Int -> String
handleEitherItem (Left s) = "拿到字符串:" ++ s
handleEitherItem (Right n) = "拿到整数:" ++ show n

为什么不能直接写["abc", 123]?

这里得提一句:Haskell的类型系统要求列表元素必须同构,这样能从根源避免很多运行时错误,这也是函数式语言类型安全的核心优势之一。直接混搭不同类型会触发编译错误,编译器会明确告诉你类型不匹配。

内容的提问来源于stack exchange,提问作者Prometheus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:11:54