gpt4 book ai didi

模板元编程的 Haskell 变体

转载 作者:行者123 更新时间:2023-12-04 22:06:07 27 4
gpt4 key购买 nike

我是 Haskell 的新手。鉴于 Haskell 的整个前提是函数将始终返回相同的值,我希望有某种方式,例如在编译时计算常量的斐波那契值,就像我可以在 C++ 中使用模板元编程一样,但我不知道该怎么做。有办法吗?

最佳答案

编辑:Daniel Fischer 指出,您可以通过使用普通函数 fib 将普通表达式提升到 Template Haskell 中并在编译时评估结果,但要受到输出类型的某些限制。然后拼接

$(let x = fib 1000 in [|x|])

原始答案如下。

正如评论中所指出的,Template Haskell 是解决这个问题的方法。对于像斐波那契这样的归纳函数,它相当简单。您编写类似于标准定义的代码,但返回一个 ExpQ 值。由于拼接限制,您需要使用 2 个模块。
{-# LANGUAGE TemplateHaskell #-} 
module TH where

import Language.Haskell.TH

fibTH :: Int -> ExpQ
fibTH 0 = [| 0 |]
fibTH 1 = [| 1 |]
fibTH n = [| $(fibTH (n-1)) + $(fibTH (n-2)) |]


{-# LANGUAGE TemplateHaskell #-}
module Main where

import TH

y :: Int
y = $(fibTH 10)

main = print y

要确认工作是在编译时执行的,我们可以使用 -ddump-simpl 进行编译。看到核心,这证实了这一点。
Main.y :: GHC.Types.Int
[GblId,
Caf=NoCafRefs,
Str=DmdType m,
Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=True,
ConLike=True, WorkFree=False, Expandable=True,
Guidance=IF_ARGS [] 10 20}]
Main.y = GHC.Types.I# 55

关于模板元编程的 Haskell 变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14078151/

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