GHC拆分表现

Smo*_*ked 6 haskell ghc

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

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

Chr*_*lor 14

您正在查看的定义是Haskell报告前奏定义.

从该页面引用(强调我的)

在本章中,给出了整个Haskell Prelude.它构成了前奏曲的规范.许多定义是以清晰而非效率的方式编写的,并且不要求如此处所示实现规范.

所以在GHC来源中,当你看到

#ifdef USE_REPORT_PRELUDE
    // Haskell report prelude definition here (inefficient)
#else
    // Efficient definition here
#endif
Run Code Online (Sandbox Code Playgroud)

#else如果要查看通常使用的定义,则应阅读分支 - 除非您特别要求Haskell报告定义.

  • 我不相信`split`的错综复杂的定义比使用`take`和`drop`的天真的定义要好. (3认同)