求助:将自定义代数数据类型列表转换为Haskell标准列表
问题修复与解决方案
1. 修正数据类型定义
你当前的List a定义存在参数冗余问题——类型参数a并未被实际使用,Cons构造器固定绑定了Elements和List Elements。推荐改成通用的参数化列表类型,这样可以复用在其他类型上:
data Elements = G | S | P deriving (Eq, Show) data List a = Empty | Cons a (List a) deriving (Show)
如果只针对Elements类型,也可以简化为:
data Elements = G | S | P deriving (Eq, Show) data List = Empty | Cons Elements List deriving (Show)
2. 修正转换函数的类型与实现
你的函数存在三个核心问题:
- 类型签名完全错误:输入应该是自定义
List类型,输出是Haskell标准[Elements]列表 - 模式匹配语法错误:构造器的匹配需要用括号包裹,且参数格式不对
- 输出顺序不符合预期:默认遍历会得到
[P, G],需要反转才能得到你要的[G, P]
基于通用参数化List的实现
toStdList :: List Elements -> [Elements] toStdList Empty = [] toStdList (Cons elem rest) = elem : toStdList rest -- 如果你需要反转结果匹配示例输出 toStdListReversed :: List Elements -> [Elements] toStdListReversed = reverse . toStdList
测试示例:
list1 = P `Cons` (G `Cons` Empty) -- 调用 toStdList list1 得到 [P, G] -- 调用 toStdListReversed list1 得到 [G, P]
基于简化List的实现
toStdList :: List -> [Elements] toStdList Empty = [] toStdList (Cons elem rest) = elem : toStdList rest toStdListReversed :: List -> [Elements] toStdListReversed = reverse . toStdList
测试示例:
list1 = P `Cons` (G `Cons` Empty) -- toStdListReversed list1 输出 [G, P]
额外说明
如果你的示例输出顺序并非需要反转,而是构造列表时顺序搞反了,那么将list1定义为G Cons(PCons Empty),直接调用toStdList就能得到[G, P]。
内容的提问来源于stack exchange,提问作者RLP
相关产品推荐
相关产品推荐

