在Haskell中是否存在"对象平等"感?

use*_*425 2 haskell identity equality

如果我在Haskell中有一个单独的链表:

data LL a = Empty | Node a (LL a) deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

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

Node 1 (Node 2 (Node 3 (Node 1 Empty)))
Run Code Online (Sandbox Code Playgroud)

我很好奇一个insertAfter方法看起来如何能够指定"在包含1的特定节点之后插入5".如果我想在第一个节点包含之后插入1,我是否必须传入整个列表来指定它,并且仅针对最后一个节点Node 1 Empty

我不确定将此作为"对象相等"来解决是否正确 - 但我想知道是否有一种方法可以在这样的数据结构中引用具有相同有效负载的类型的特定元素.

ama*_*loy 7

不,没有这样的事情.分辨价值的唯一方法是它们的结构; 在某些语言中没有类似对象的身份.也就是说,你无法区分这两个值:(Just 5, Just 5)行为完全相同let x = Just 5 in (x, x).同样,"this Node 1"和"some other Node 1" 之间没有区别:它们无法区分.

通常,这个问题的"解决方案"是以某种其他方式考虑您的问题,以便不再需要基于身份进行区分(通常实际上并不需要).但是,正如评论中所提到的,您可以通过生成某种类型的不同标记来模拟其他语言的"指针"机制,例如增加整数,并为每个对象分配一个,以便您可以区分它们.

  • @ user2666425听起来好像他们要求你在Haskell那样做,你有一个很好的提示不能在那个地方工作. (3认同)
  • @ user2666425引用不存在的事实.链表是一种从根本上依赖于指针的数据结构,这些指针在函数式语言中不存在. (2认同)