2013-09-30 45 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