在Haskell中有对象等价性的意义吗? [英] Is there a sense of 'object equality' in Haskell?

查看:0
本文介绍了在Haskell中有对象等价性的意义吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我在Haskell中有一个单链接列表:

data LL a = Empty | Node a (LL a) deriving (Show, Eq)

我可以轻松地实现在结尾和开头插入的方法。但是,如何在特定元素之前或之后插入呢?如果我有LLInteger,我能否在Haskell中区分在包含1的特定节点之后插入4,而不是在处理列表时看到的第一个1

Node 1 (Node 2 (Node 3 (Node 1 Empty)))

我很好奇insertAfter方法会是什么样子,您可以指定"在这个包含1的特定节点后插入5"。如果我想在包含1的第一个节点之后插入,是否必须传入整个列表才能指定,而对于最后一个节点,只需Node 1 Empty

我不确定将其称为"对象相等"是否正确--但我想知道是否有办法在这样的数据结构中引用具有相同有效负载的类型的特定元素。

推荐答案

不,没有这回事。区分值的唯一方法是通过它们的结构;在某些语言中没有类似标识的对象。也就是说,您无法区分这两个值:(Just 5, Just 5)的行为与let x = Just 5 in (x, x)完全相同。同样,"ThisNode 1"和"Some OtherNode 1"之间也没有区别:它们没有区别。

通常,这个问题的"解决方案"是以其他方式考虑您的问题,这样就不再需要根据身份进行区分(通常实际上也没有必要)。但是,正如评论中提到的,你可以自己模仿其他语言的"指针"机制,通过生成某种不同的标签,例如增加整数,并为每个对象分配一个,这样你就可以区分它们。

这篇关于在Haskell中有对象等价性的意义吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆