gpt4 book ai didi

haskell - 我可以在运行时从字符串编译haskell函数(使用插件)吗?

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

我有一个应用程序,由于各种原因,我需要运行任意的用户提供的代码。 (SafeHaskell 使这变得既好又安全)。我查看了插件包,它非常适合从光盘上的 .hi 文件加载。

但是,对于我的程序设计,如果我可以将这些用户程序存储在数据库中,然后直接将它们编译为我可以在我的程序中使用的函数,那将是理想的选择。

因此,如果我正在编译的函数具有以下类型:

someFunction :: MyIn -> MyOut

我正在寻找一些可以从字符串生成该函数的函数:
hotCompile :: String -> IO (MyIn -> MyOut)

其中 string 包含“someFunction”的 haskell 代码。

有谁知道是否有办法做到这一点,最好使用插件包?我遇到了一点 GHC API,但我不太了解它以及它与此有何关系。

请注意,我尝试过提示,但它不适合我的应用程序,因为它不是线程安全的。

最佳答案

使用包hint我们可以定义eval很容易 , 下面是一个独立脚本的例子(你仍然需要 nix 来运行它)

#!/usr/bin/env nix-shell
#! nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [hint])"
#! nix-shell -i "ghci -ignore-dot-ghci -fdefer-type-errors -XTypeApplications"

{-# LANGUAGE ScopedTypeVariables, TypeApplications, PartialTypeSignatures #-}

import Data.Typeable (Typeable)
import qualified Language.Haskell.Interpreter as Hint

-- DOC: https://www.stackage.org/lts-18.18/package/hint-0.9.0.4

eval :: forall t. Typeable t => String -> IO t
eval s = do
mr <- Hint.runInterpreter $ do
Hint.setImports ["Prelude"]
Hint.interpret s (Hint.as :: t)
case mr of
Left err -> error (show err)
Right r -> pure r

-- * Interpret expressions into values:

e1 = eval @Int "1 + 1 :: Int"
e2 = eval @String "\"hello eval\""

-- * Send values from your compiled program to your interpreted program by interpreting a function:

e3 = do
f <- eval @(Int -> [Int]) "\\x -> [1..x]"
pure (f 5)

关于haskell - 我可以在运行时从字符串编译haskell函数(使用插件)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20579599/

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