Сериализация функций в Haskell
Есть ли способ сериализации (чтение/показ) функций в Haskell?
Например, при условии, что:
:t (+1)
(+1) :: Num a => a -> a
Я хочу иметь что-то вроде:
read "(+1)" :: Num a => a -> a
К сожалению, это вызывает ошибку:
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
Ответы
Ответ 1
Вы можете использовать что-то вроде plugins для чтения кода во время выполнения. Показ, по словам Августа, невозможным, хотя.
Пример того, как это можно использовать:
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. :("
Ответ 2
Это (вообще) невозможно показать функцию, но чтение одного возможно в принципе, если у вас есть компилятор Haskell, доступный во время выполнения.