Haskell中函数的序列化

Ros*_*oto 11 haskell

有没有办法在Haskell中序列化(读/显示)函数?

举例来说:

:t (+1) 
(+1) :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

我希望能够有类似的东西:

read "(+1)" :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会引发错误:

Could not deduce (Read (a -> a)) arising from a use of `read'
from the context (Num a)
  bound by an expression type signature: Num a => a -> a
  at <interactive>:1:1-30
Possible fix:
  add (Read (a -> a)) to the context of
    an expression type signature: Num a => a -> a
  or add an instance declaration for (Read (a -> a))
In the expression: read "(+1)" :: Num a => a -> a
In an equation for `it': it = read "(+1)" :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

aug*_*tss 10

它(通常)不可能显示一个函数,但如果你在运行时有一个Haskell编译器,原则上可以读取一个函数.


val*_*man 7

您可以使用类似插件包的东西在运行时读取代码.正如奥古斯特所说,显示是不可能的.

如何使用它的一个例子:

import System.Eval.Haskell

main = do
  mf <- eval "(+1) :: Int -> Int" []
  case mf of
    Just f -> print $ (f :: Int -> Int) 0
    _      -> putStrLn "Couldn't eval for some reason. :("
Run Code Online (Sandbox Code Playgroud)