gpt4 book ai didi

haskell - 为什么 Prelude 中的 init 函数有两种定义?

转载 作者:行者123 更新时间:2023-12-03 15:02:52 25 4
gpt4 key购买 nike

我在 Prelude 中找到了函数 init 的两个定义:

init [x] = []
init (x:xs) = x : init xs
init [] = errorEmptyList "init"

init [] = errorEmptyList "init"
init (x:xs) = init' x xs
where init' _ [] = []
init' y (z:zs) = y : init' z zs

第二个定义的原因是什么?

最佳答案

你没有逐字引用它。其实是:

-- | Return all the elements of a list except the last one.
-- The list must be non-empty.
init :: [a] -> [a]
#if defined(USE_REPORT_PRELUDE)
init [x] = []
init (x:xs) = x : init xs
init [] = errorEmptyList "init"
#else
-- eliminate repeated cases
init [] = errorEmptyList "init"
init (x:xs) = init' x xs
where init' _ [] = []
init' y (z:zs) = y : init' z zs
#endif
USE_REPORT_PRELUDE意味着这段代码遵循 Haskell Report,而另一段代码可能是更有效的实现。查看 this thread关于 reverse 的类似讨论.

关于haskell - 为什么 Prelude 中的 init 函数有两种定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55183204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com