2013-09-30 36 views
0

我得到这个“计划:序曲(!!):指数过大”错误的下面的代码:四处错误:序曲(!!):指数太大

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 

有谁知道它为什么给我这个错误或我怎么能修复它?

+0

[1..10] !! 11返回相同的错误。看起来你正试图访问一个超出r容量的索引。 – Jerome

回答

2

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

所以你可能会得到这个错误,例如,如果header不包含column_name

再一次,不知道你到底想做什么,但如果有机会没有结果,或许你想用Maybe来包装结果?

+0

感谢您的回复,我不确定可能会做什么或者我可以在这里使用它? – Skyfe

+0

它只是'data Maybe a = Nothing |只是一个'。所以你要么有一个结果('只是the_value'),要么你什么都没有。所以,现在将是客户端代码的责任,以确定操作是否成功(例如,模式加工)。这是在Haskell中执行错误处理的一种方法,您可能需要查找其他选择。 http://www.randomhacks.net/articles/2007/03/10/haskell-8-ways-to-report-errors当然,如果操作应该总是成功,那么不需要错误处理,在这种情况下,你的代码中有一个错误,你必须修复它;) –

+1

谢谢!将一定看看它。只是我不知道应该如何使用'Maybe int'作为索引来检索找到的索引的相应值(在另一个对应的数组中),因为它只接受常规整数 – Skyfe