【发布时间】:2011-12-29 12:11:03
【问题描述】:
基本上我想实现一个包含可以更新的列表的元组(或任何适合我的问题的数据类型)。由于不可变性等原因,下面的演示代码当然不起作用。这只是为了更好地说明我想要实现的目标。
我想知道有什么优雅的方法、数据类型(IOREfs?)或模块可以为我做到这一点,或者在这种情况下,我真的需要拆开整个元组,并用更新的元素重建它。
顺便说一句:直觉上,我预计至少只要不打印测试,就不会评估列表消息。
test = ("192.168.1.1", 3455, (1234566, msgs))
msgs = ["aaa", "bbbb", "ccccc"]
main = do
--print test
let msg_tmp = "first" : msgs
let msgs = msg_tmp
print msgs
print test
【问题讨论】:
-
您真的要求可变性,还是只是想要更简单的方法来创建一些不可变数据的新版本?在前一种情况下,请重新考虑。特别是如果您来自一种允许可变性的语言。
-
定义“成本”。你不担心性能,是吗?如果是这样,你会感到羞耻。回去学习;)
-
您可能走错了路,在 io 和 st monad 中有可变数据结构,但除非您需要,否则让 ghc 为您整理并使用纯功能数据结构。跨度>
-
@delnan 我不认为像“为你感到羞耻”这样的 cmets 支持任何事情或任何人。
-
正如笑脸所表明的那样(或者我希望如此),我是在开玩笑。但说真的,你似乎在担心非问题。除了通常的“微优化是万恶之源”之外,GHC 编译的 Haskell 通常非常快,即使是所有不可变的数据也是如此。只需编写惯用的 Haskell 代码 - 这涉及大量的不变性,可变性的选项在以后引入并非常谨慎地使用。
标签: haskell