首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用自定义数据类型haskell

使用自定义数据类型haskell
EN

Stack Overflow用户
提问于 2016-11-24 00:42:56
回答 1查看 2K关注 0票数 1

我有这个数据类型data List x = LT [(x,[String])],我一直在尝试创建一个函数来向List添加一个新元素。

例如,通过使用函数add

add ('a', ["1","2"]) [('x',["1"])]

结果将是:

[('x',["1"]), ('a', ["1","2"])]

命令是什么并不重要。我试了很多,还是不太明白。

这就是我试过的

代码语言:javascript
运行
复制
`add:: Ord a => a -> List a -> List a 
 add _ (LT[]) = empty 
 add x (LT(y:ys))
     | belongs x (LT(y:ys)) = (LT(y:ys)) 
     | otherwise = (LT(y:ys)) ++ (LT(x))`

有人能帮忙吗?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-11-24 02:45:05

正如丹尼·威尔逊所指出的,您可以使用++操作符连接两个列表:

代码语言:javascript
运行
复制
ghci> [1,2] ++ [3,4]
[1,2,3,4]

请记住,++的两边都需要列表,并且您有一个列表和一个非列表,所以您需要先将其中一个列表放入列表中。

根据您的措辞中的一些细节,我有一个粗略的猜测,您在数据构造函数方面有问题。List x不采用以下形式

代码语言:javascript
运行
复制
[('x',["1"])]

但却相反

代码语言:javascript
运行
复制
LT [('x',["1"])]

它只是一个与LT构造函数“包装”的常规列表。如果要编写函数add,则需要在此构造函数上进行模式匹配。List类型的每个值都以“LT”开头

代码语言:javascript
运行
复制
add :: (x, [String]) -> List x -> List x
add elem (LT list) = LT (...)

(你需要自己填写... )

您只需要在需要访问类型的内部(列表)时才将LT放在其中。因此,此函数返回未修改的列表,并且不需要LT

代码语言:javascript
运行
复制
doNothing :: List x -> List x
doNothing a = a

但是,一旦您需要知道List x是由一些东西的列表表示的,就需要使用LT构造函数。

这有用吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40776444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档