splitAt以这种方式在GHC中实现:
splitAt n xs = (take n xs, drop n xs)
答案 0 :(得分:14)
您正在查看的定义是Haskell Report Prelude定义。
从该页面引用(强调我的)
在本章中给出了整个Haskell Prelude。它构成了前奏曲的规范。 许多定义是以清晰而非效率的方式编写的,并且不要求如此处所示实现规范。
所以在GHC来源中,当你看到
#ifdef USE_REPORT_PRELUDE
// Haskell report prelude definition here (inefficient)
#else
// Efficient definition here
#endif
如果要查看通常使用的定义,则应阅读#else
分支 - 除非您特别要求Haskell报告定义。
答案 1 :(得分:2)
关于你的第二个问题,递归过程通常是你在处理列表时所需要的,因为它们是一个棘手的数据结构。请考虑以下代码:
head (take 100 [1 ..])
如果我们遵循代码,我们最终会得到以下表达式:1 : take (100 - 1) [2 ..]
。由于我们只对列表的头部感兴趣,因此永远不会评估对take
的递归调用。但是,如果要将take
实现为迭代过程,则需要遍历所有100个元素,即使只需要第一个元素。