gpt4 book ai didi

haskell - 我可以使用模板 haskell 来定义缺少的功能吗?

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

我有一种情况,我需要在不同的机器上编译一些 Haskell 代码。
这些机器中至少有一台具有相当旧的 Control.Concurrent.STM 版本。 , 那不知道 modifyTVar .我目前的解决方法是从 newer version 复制 modifyTVar 的代码。的包。这让我想知道,是否可以使用模板 Haskell 来检查一个函数是否已经定义并且只定义它,如果它丢失了。我知道正确的解决方案可能是获取更新的软件包,但这种情况让我很好奇。

最佳答案

似乎可以如下。首先是一个辅助模块:

{-# LANGUAGE TemplateHaskell #-}

module AddFn where

import Language.Haskell.TH

-- | Add a function if it doesn't exist.
addFn :: String -> Q [Dec] -> Q [Dec]
addFn name decl = do
r <- lookupValueName name
case r of
Just l -> return []
Nothing -> report False ("adding missing " ++ name) >> decl

并使用它
{-# LANGUAGE TemplateHaskell #-}

module Main where

import AddFn
import qualified Data.Traversable as T

$(addFn "mapM"
[d| mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
mapM = T.mapM
|])

$(addFn "mapM1"
[d| mapM1 :: (Monad m) => (a -> m b) -> [a] -> m [b]
mapM1 = T.mapM
|])

缺点是它使用 lookupValueName ,这仅存在于最新版本的 TH 中,因此在处理旧安装时,这可能无济于事。也许一个可能的解决方案是调用 reify在给定名称上,并使用 recover处理名称丢失的情况。

更新:使用 reify 的版本而不是 lookupValueName作品:
-- | Add a function if it doesn't exist.
addFn :: String -> Q [Dec] -> Q [Dec]
addFn name decl = recover decl (reify (mkName name) >> return [])

关于haskell - 我可以使用模板 haskell 来定义缺少的功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24233346/

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