gpt4 book ai didi

haskell - Haskell 中的函数是否可以 'read' ?

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

新用户,半新手 Haskell 程序员。我一直在研究“在 48 小时内为自己编写一个方案”,我突然想到,尽管这在实践中极其不安全,但看看 Haskell 程序是否可以“读取”函数会很有趣。

例如,读取 "+"::Num a => a -> a -> a -- (即 (+) 的类型)

但是上面的例子并没有起作用。有任何想法吗?我知道这在实践中是一件非常愚蠢的事情,但如果可能的话那就太酷了,对吧?

最佳答案

Haskell 是一种静态编译语言,您可以使用 Language.Haskell.Interpreter 将字符串解释为函数.

读取类型为 Int -> Int -> Int 的二进制函数的最小示例是:

import Language.Haskell.Interpreter
import System.Environment (getArgs)

main :: IO ()
main = do
args <- getArgs
-- check that head args exists!
errorOrF <- runInterpreter $ do
setImports ["Prelude"]
interpret (head args) (as::Int -> Int -> Int)
case errorOrF of
Left errs -> print errs
Right f -> print $ f 1 2

你可以这样调用这个程序(这里我假设带有代码的文件名是test.hs):

> ghc test.hs
...
> ./test "\\x y -> x + y"
3

该程序的核心是runInterpreter ,这就是解释器解释字符串的地方。我们首先将 Prelude 模块添加到上下文中 setImports例如,使 + 函数可用。然后我们调用interpret将第一个参数解释为函数,我们使用 as Int -> Int -> Int 强制执行类型。runInterpreter 的结果是 Either InterpretError a,其中 a 是您的类型。如果结果是Left,那么你就有错误,否则你就有你的函数或值。一旦从 Right 中提取了它,您就可以像使用 Haskell 函数一样使用它。例如,请参阅上面的 f 1 2

如果您想要更完整的示例,您可以查看 haskell-awk ,这是我和 gelisam 的项目,用于实现一个类似 awk 的命令行实用程序,使用 Haskell 代码而不是 AWK 代码。我们使用Language.Haskell.Interpreter来解释用户函数。

关于haskell - Haskell 中的函数是否可以 'read' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24026444/

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