如何将Haskell异常用于索引否定

时间:2018-10-13 22:57:29

标签: haskell

我正在尝试解决我的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)

您能帮我找出我做错了什么地方吗?

2 个答案:

答案 0 :(得分:1)

为您的递归添加终止条件。在每个通话中,您都从i中减去1,而当其低于0时,您只会抛出错误。

答案 1 :(得分:0)

可能最简单的方法是使用Prelude takedrop函数来处理列表。然后,您只需要进行边界检查即可:

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报告成功或失败。一方面不同意上述问题;另一方面另一方面,它使调用者有机会在不立即终止程序的情况下处理错误,这是很有礼貌的。