为什么要采取全面的功能

fal*_*lse 10 haskell partial-functions

take (-1) []是[].

在部分功能上更喜欢这个的原因是什么,即错误?

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

Eri*_*ikR 7

take并且drop类似于left-substring和right-substring函数,并且在实践中证明它对于那些不为负数或无效长度引发错误的人来说是方便的.

例如 - 填充功能:

pad :: Int -> String -> String
pad n str = (repeat (n - length str) ' ') ++ str
Run Code Online (Sandbox Code Playgroud)

这是一个用另一个字符串填充的变体:

padWith :: String -> Int -> String -> String
padWith field n str = (take (n - length str) field) ++ str
Run Code Online (Sandbox Code Playgroud)


chi*_*chi 4

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

chunks n [] = []
chunks n xs = take n xs : chunks n (drop n xs)
Run Code Online (Sandbox Code Playgroud)

此外,当前的定义确保

take n xs ++ drop n xs == xs
Run Code Online (Sandbox Code Playgroud)

对于任何n和xs.

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

类似的担忧也来自zip,即使应用于长度不等的列表,它也是完全的。zip [1..] xs尽管如此,在将列表中的每个元素与其自己的索引配对的惯用法中仍然经常利用这一点。

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

  • @false:我认为 chi 的观点是 `take` 在另一种意义上也是部分的(从 [1,2,3] 中取出 10 个元素几乎比取出 (-1) 个元素更有可能)。因此,仅将其限制为负数是不连贯的。顺便说一句,当列表长度不同时,Ocaml zip(称为“combine”)会抛出异常,我听说这就是痛苦。 (2认同)