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. :("
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With