Serialization of functions in Haskell
Is there a way to serialize (read/show) functions in Haskell?
For example given that:
:t (+1)
(+1) :: Num a => a -> a
I wish to be able to have something like:
read "(+1)" :: Num a => a -> a
Unfortunately this throws an error:
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
It's (in general) impossible to show a function, but reading one is possible in principle if you have a Haskell compiler available at runtime.
You could use something like the plugins package to read code at runtime. Showing is, as augustss says, impossible though.
An example of how it could be used:
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. :("
精彩评论