开发者

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. :("
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜