10

take (-1) [][]

比偏函数(即错误)更喜欢它的原因是什么?

是否存在利用此属性的用例?

4

2 回答 2

7

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
于 2014-11-27T18:18:08.620 回答
4

将列表拆分为(最多)n块需要take总计:

chunks n [] = []
chunks n xs = take n xs : chunks n (drop n xs)

此外,当前的定义确保

take n xs ++ drop n xs == xs

对于任何nxs

可以说,我们应该同时拥有takeAtMostand takeAtLeast,后者是部分变体(或者返回Maybe)。

类似的问题zip也来自 ,即使应用于长度不等的列表也是如此。zip [1..] xs尽管如此,这在将列表中的每个元素与其自己的索引配对的习语中经常被利用。

但是请记住,我并不是说总功能始终是首选功能。在许多许多编程任务中,与获得错误结果并且不知道错误在哪里相比,获得错误揭示异常是一种幸福。或者更糟糕的是,得到一个错误但看似合理的结果,甚至没有发现有错误。

于 2014-11-27T18:15:34.500 回答