GHC拆分表现

时间:2013-12-06 09:58:14

标签: haskell ghc

splitAt以这种方式在GHC中实现:

splitAt n xs  =  (take n xs, drop n xs)
  1. 那么,splitAt会做两倍的工作还是幕后优化呢?
  2. 此外,take和drop生成递归过程。这是为什么。毕竟它们是图书馆的功能,美丽并不重要。为什么他们没有实施创建迭代过程?

2 个答案:

答案 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个元素,即使只需要第一个元素。