gpt4 book ai didi

haskell - 在 haskell 中使用引用透明度预先计算值

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

假设我们有一个这样的程序:

list = [1..10000000]

main = print $ sum list

我希望将其编译为可执行文件仅打印 50000005000000,而无需花费太多时间和精力。

基本上,任何肯定会被计算的表达式(也许严格分析在这里会有所帮助)都可以在编译期间预先计算(即我们使用引用透明性来表示计算值时并不重要)。

简而言之: “必须计算” + 引用透明度 = 可以预先计算

这就像运行程序直到我们遇到依赖于输入的东西(即程序的核心,所有输入通用的,将被预先计算)

目前是否有实现这一目标的现有机制(用 Haskell 或任何其他语言)? [请不要指向 C++ 中的模板之类的东西,因为它首先没有引用透明性。]

如果不是,这个问题有多难? [伴随的技术(和理论)问题是什么?]

最佳答案

进行编译时计算的通用答案是使用 Template Haskell。但是对于这个特定的用例,您可以使用 vector包和 LLVM 后端,GHC 将优化掉这个总和。

sorghum:~% cat >test.hs
import Data.Vector.Unboxed as V
main = print (V.sum $ V.enumFromN (1 :: Int) 10000000)
sorghum:~% ghc --make -O2 -fllvm test.hs
[1 of 1] Compiling Main ( test.hs, test.o )
Linking test ...
sorghum:~% time ./test
50000005000000
./test 0.00s user 0.00s system 0% cpu 0.002 total
sorghum:~% objdump -d test | grep 2d7988896b40
40653d: 48 bb 40 6b 89 88 79 movabs $0x2d7988896b40,%rbx
406547: 49 be 40 6b 89 88 79 movabs $0x2d7988896b40,%r14

(如果不是很明显, 0x2d79888896b4050000005000000 。)

关于haskell - 在 haskell 中使用引用透明度预先计算值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10093884/

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