如何用自定义List类型data type List a = Empty | Cons a (List a)表示[[a]]?
如何用自定义List类型表示嵌套列表
[[a]] 嘿,我来帮你理清这个问题!你遇到的'List' not in scope错误,核心原因是当你尝试写List (List a)时,自定义的List类型并没有在当前作用域被正确识别——比如可能你在GHCi里输入了类型定义但没确认生效,或者代码里的定义有小疏漏?
首先,先确保你的List类型定义是完整且正确的,建议加上deriving Show方便后续查看结果:
data List a = Empty | Cons a (List a) deriving (Show)
现在,要表示[[a]](也就是元素本身是List a的List),正确的类型就是List (List a),这完全是可行的,只要List类型在当前作用域内就行。
给你举个具体的例子:如果你想表示[[1,2], [3], []]这个嵌套列表,对应的构造写法是这样的:
nestedList :: List (List Int) nestedList = Cons (Cons 1 (Cons 2 Empty)) (Cons (Cons 3 Empty) (Cons Empty Empty))
在GHCi里运行这个,因为我们加了deriving Show,会输出对应的结构:Cons (Cons 1 (Cons 2 Empty)) (Cons (Cons 3 Empty) (Cons Empty Empty)),完全对应我们想要的嵌套列表结构。
你之前尝试的List (Cons x xs)是不对的,因为Cons是值构造器,不是类型——List的类型参数需要是一个类型,而Cons x xs是一个具体的List a值,所以不能用来作为List的类型参数哦。
最后再总结下正确的步骤:
- 确保
List类型的定义在当前作用域(比如同一个代码文件里,或者GHCi里已经正确输入并执行了定义) - 用
List (List a)作为嵌套列表的类型 - 通过嵌套使用
Cons和Empty来构造具体的嵌套列表值
内容的提问来源于stack exchange,提问作者Tempro43
相关产品推荐
相关产品推荐

