我正在尝试解决我的Haskell问题之一。这个问题问我要提取整数列表的一部分。函数应该包含一个列表和两个索引,新的列表号包含两个索引之间。
此功能;
示例:
makeSlice [1,2,3,4,5] 2 3
[3,4]
makeSlice [1,2,3,4,5] (-1) 3
*** Exception: First index cannot be negative
我尝试了一些选项,但是如果我给出正数,则会在函数下面得到“第一个索引不能为负” 异常
makeSlice :: [a] -> Int -> Int -> [a]
makeSlice [] _ _ =[]
makeSlice (h:t) i k
|k < 0 = []
| i>k = error "First index cannot be greater than second index (i > k)"
| i< 0 = error "First index cannot be negative (i < 0)!"
| i>0 = makeSlice t (i - 1) (k - 1)
| otherwise = h:makeSlice t (i -1 ) (k - 1)
您能帮我找出我做错了什么地方吗?
答案 0 :(得分:1)
为您的递归添加终止条件。在每个通话中,您都从i中减去1,而当其低于0时,您只会抛出错误。
答案 1 :(得分:0)
可能最简单的方法是使用Prelude take和drop函数来处理列表。然后,您只需要进行边界检查即可:
slice :: Int -> Int -> [a] -> Either String [a]
slice from to lst
| from < 0 = Left "First index cannot be negative (i < 0)!"
| to < from = Left "First index cannot be greater than second index (i > k)"
| otherwise = Right $ take (to - from) $ drop from $ lst
在这里,我使用Either
报告成功或失败。一方面不同意上述问题;另一方面另一方面,它使调用者有机会在不立即终止程序的情况下处理错误,这是很有礼貌的。