take (-1) []
是[]
。
偏爱部分功能的原因是什么,即错误?
是否存在利用此属性的用例?
答案 0 :(得分:7)
take
和drop
类似于left-substring和right-substring函数,并且在实践中证明它对于那些不会因负数或无效长度引发错误的人来说非常方便
例如 - 填充函数:
pad :: Int -> String -> String
pad n str = (repeat (n - length str) ' ') ++ str
这是一个用另一个字符串填充的变体:
padWith :: String -> Int -> String -> String
padWith field n str = (take (n - length str) field) ++ str
答案 1 :(得分:4)
以最多({最多)n
块的方式拆分列表需要take
为总数:
chunks n [] = []
chunks n xs = take n xs : chunks n (drop n xs)
此外,当前定义确保
take n xs ++ drop n xs == xs
适用于任何n
和xs
。
可以说,我们应该同时拥有takeAtMost
和takeAtLeast
,后者是部分变体(或者代之以Maybe
)。
类似的问题来自zip
,即使应用于长度不等的列表也是如此。不过,在成语zip [1..] xs
中经常被利用,它将列表的每个元素与自己的索引配对。
请记住,我并不是说总功能始终是首选功能。在许多情况下,获取错误揭示异常的许多编程任务与获取错误的结果并且不知道错误位置相比是一种幸福。或者更糟糕的是,得到一个错误但似乎合理的结果,甚至没有发现有错误。