【问题标题】:Getting error: Prelude.(!!): index too large出现错误:前奏。(!!):索引太大
【发布时间】:2013-09-30 00:50:56
【问题描述】:

我收到以下代码的“程序:Prelude.(!!): index too large”错误:

select :: Field -> Field -> Table -> Table
select column_name column_value (header:t) = header:filterT t
                where filterT = filter testR
                      field_idx = (elemIndices column_name header)!!0
                      testR r | r!!field_idx == column_value = True
                      testR r | otherwise = False

我认为错误与代码的以下部分有关:

              field_idx = (elemIndices column_name header)!!0
              testR r | r!!field_idx == column_value = True

有谁知道它为什么给我这个错误或我该如何解决它?

【问题讨论】:

  • [1..10]!!11 返回相同的错误。您似乎正在尝试访问超出 r 容量的索引。

标签: list haskell indexing


【解决方案1】:

我不确定你在做什么,但我希望你知道,!! 不是一个安全的操作。具有索引的元素不一定存在。

因此,如果header 不包含column_name,您可能会收到此错误。

同样,不确定您到底想要做什么,但如果有机会没有结果,也许您想用Maybe 包装结果?

【讨论】:

  • 感谢您的回复,我不知道 Maybe 能做什么或如何在这里使用它?
  • 只是data Maybe a = Nothing | Just a。因此,您要么有结果(Just the_value),要么一无所有。因此,现在将由客户端代码负责确定操作是否成功(例如,使用模式加工)。这是在 Haskell 中进行错误处理的一种方法,您可能需要查找其他替代方法。 randomhacks.net/articles/2007/03/10/… 当然,如果操作应该总是成功,你不需要错误处理,在这种情况下,你的代码中有一个错误,你必须修复它;)
  • 谢谢!一定会调查的。只是我不确定我应该如何使用“Maybe int”作为索引来检索找到的索引的相应值(在另一个对应的数组中),因为它只接受常规整数
  • 您可以通过模式匹配获取 int,我链接的页面显示了一个示例。
猜你喜欢
  • 1970-01-01
  • 2017-01-21
  • 2016-11-15
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2019-09-05
相关资源
最近更新 更多