take (-1) []
[]
。
为什么更喜欢这个而不是部分函数,即错误?
是否存在利用此属性的用例?
> take
和 drop
类似于左子字符串和右子字符串函数,并且在实践中证明,对于那些不会因负或无效长度引发错误的人来说
例如 - 填充函数:
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
将列表拆分为(最多)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
中经常被利用,该成语将列表中的每个元素与其自己的索引配对。
但请记住,我并不是说总函数总是首选函数。在许多编程任务中,与获得错误的结果并且不知道错误在哪里相比,获得揭示错误的异常是一种幸福。或者更糟糕的是,得到一个错误但合理的结果,甚至没有发现存在错误。