gpt4 book ai didi

haskell - 用newtype构造函数映射有什么作用

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

thinking with types 的第 8 章中我了解到 fmap Sum部分

fastSum :: [Int] -> Int
fastSum = getSum . mconcat . fmap Sum
有一个 O(n)运行时成本,而使用 coerce而是避免了这种开销。
我知道 newtype s 没有表示开销,但我不明白将 newtype 构造函数映射到列表的运行时效果是什么。我认为这只会有编译时开销,应该只是 O(1) , 因为编译器只需要知道 fmap SomeNewtypeCtr 的类型表达。

最佳答案

由于优化,很难理解 Haskell 在这种情况下究竟做了什么。 Haskell 只规定结果是什么,而不是如何获得。
一些可能性:

  • fmap Sum执行列表扫描,并复制每个单元格和每个元素;
  • fmap Sum执行列表扫描,并复制每个单元格但不复制元素(新单元格指向旧元素);
  • fmap Sum根本不扫描列表并自动优化为无操作。

  • 我试过 godbolt.org检查生成的核心和程序集。请注意,它仍然使用旧的 GHC 8.6.2。尽管如此,我还是打开了优化( -O2 )并编译
    foo :: [Int] -> [Sum Int]
    foo = fmap Sum
    并获得
    foo = Example.foo1 `cast` (.....)
    Example.foo1 = \ (v_a1iF :: [Int]) -> v_a1iF
    因此 foo成为恒等函数,适当强制,生成程序集
       movq %r14,%rbx
    andq $-8,%rbx
    jmp *(%rbx)
    粗略地说,这应该相当于 GHC 运行时系统中的立即返回。
    结论: Data.Coerce.coerce非常好,因为它确保了无操作,但即使是普通的 Haskell,在优化之后也可以非常高效。

    关于haskell - 用newtype构造函数映射有什么作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64192785/

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