Сериализация функций в 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

2 ответа

Решение

Вы можете использовать что-то вроде пакета плагинов для чтения кода во время выполнения. Показывать, как говорит Огюстс, невозможно.

Пример того, как это можно использовать:

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

(Вообще) невозможно показать функцию, но ее чтение в принципе возможно, если у вас есть компилятор Haskell, доступный во время выполнения.

Другие вопросы по тегам