- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 Python 和 Javascript 背景,我真的无法理解为什么在 Haskell 中更新列表元素并不简单。我的意思是,为什么我不能写像 myList[0] = "newValue"
这样简单的东西?
所以,我有两个问题:
最佳答案
这与列表无关。有意地,在 Haskell 中根本不可能更新任何值。
为什么?好吧,这就是语言的设计方式。您可能还会问为什么命令式语言允许更新值。我是说,你写
x = 3
然后你写
x = 4
什么?那么第一个是谎言还是什么?当然,我们应该明确指出我们指的是两个不同的时间变量。这只是问 bug!当然,仅仅保存一些字符并启用一些也可以通过其他更安全的方式实现的低级优化是不值得的吗?
...对不对?
即使在命令式语言中,更新(链接)列表中的值实际上也没有多大意义——无论如何你需要遍历 O(n)个参数甚至到达应该更改的那个。创建一个全新的列表平均只需要更改旧列表的两倍时间,但与命令式更新不同,你永远不需要担心其他东西是否仍然需要旧版本,因为你永远不会干扰它。†
而且链表通常非常慢,所以担心 2× 因子也没有多大意义。但是,GHC 通常会完全优化列表,因此它们实际上根本不会在内存中构建,如果编译器不得不担心某些事情,那将是编译器难以保证的事情之一在其他地方改变列表。
更新数组中的元素,那是另一回事。事实上,更新数组中的值在 Haskell 中也很常见,对于可以带来重要性能提升的应用程序。仍然不可能更新数组类型的值,但可以通过对单子(monad)可变数组的引用来更新值。这最终看起来与您在命令式语言中更新数组的方式非常相似,尽管它通常有点冗长,因为所有数组工具都需要从库中导入,而不是使用内置语法。
import qualified Data.Vector.Mutable as VM
main :: IO ()
main = do
myArray <- VM.generate 37 (const "this element isn't set yet")
print =<< VM.read myArray 0
VM.write myArray 0 "newValue"
print =<< VM.read myArray 0
等效的 Python:
def main():
myArray = ["this element isn't set yet"] * 37
print(myArray[0])
myArray[0] = "newValue"
print(myArray[0])
但是,很多时候您并不是真的需要更新元素。事实上,我们立即在这里看到了一个问题:您正在索引到一个数组中。这意味着您需要确保索引确实存在。在命令式语言中,这很常见,你几乎不会去想它,但在 Haskell 中,我们真的更喜欢 total 代码,也就是说,即使我们不小心交换了两个变量(比如两个不同的循环索引),它也不应该给出运行时错误,但最好是编译器错误。
通常情况下,如果您更新单个元素,您也会更新其他元素。事实上,很多时候你会按顺序更新它们中的所有,然后从头开始简单地构建一个包含更新的新列表就没有太多优势了值马上。使用这种方法,几乎不会出错,至少在运行时不会出错。
†这里有一个很大的警告:如果其他人仍在使用旧列表,则意味着垃圾收集器无法回收内存。这就是为什么在 Haskell 中很容易发生内存泄漏的原因——IMO 是该语言的最大问题。
关于list - 如何更新 Haskell 中的列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69949373/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!