2011-08-03 17 views
11

¿Hay alguna forma de serializar (leer/mostrar) funciones en Haskell?Serialización de funciones en Haskell

Por ejemplo teniendo en cuenta que:

:t (+1) 
(+1) :: Num a => a -> a 

Deseo ser capaz de tener algo como:

read "(+1)" :: Num a => a -> a 

Desafortunadamente esto arroja un 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 
+3

Esta es precisamente una zona donde brillan dialectos Lisp. –

+4

Una variante temprana de Haskell - Haskell persistente - permitió serializar las funciones. No estoy seguro de si alguna vez estuvo a disposición del público, ya que dependía de la tecnología desarrollada en la Universidad de St. Andrews (Escocia) para el lenguaje persistente Napier88. No lo leí de cerca, pero el reciente documento "Towards Haskell in the Cloud" parece sugerir que el trabajo sobre serialización de funciones para programación distribuida podría haber comenzado en el GHC principal. –

+3

De hecho, hay trabajo en funciones de serialización para ghc, pero será limitado. – augustss

Respuesta

6

Puede usar algo como el paquete plugins para leer el código en tiempo de ejecución. Mostrar es, como augusto dice, imposible.

Un ejemplo de cómo se podría utilizar:

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

Podría proporcionar algunos ejemplos de código – Roskoto

+0

Se agregó un ejemplo de uso a la respuesta. – valderman

+0

También está el paquete Hint, pero no sé cuáles son las diferencias. – gatoatigrado

10

Es (en general) imposible de mostrar una función, pero leer uno es posible en principio si tienes un compilador Haskell disponible en ru ntime.

+0

¿Podría proporcionar algunos ejemplos de código – Roskoto

+1

Ejemplos de código? De un compilador Haskell? – augustss

+0

Ciertamente no es imposible. Puede 'mostrar' la fuente original, cualquier representación interna del compilador, o preferiblemente algún bytecode independiente de la máquina. Esto se puede transferir y leer de nuevo usando el paquete' dynamic-loader' o 'plugins'. ... No dije que sería bonito sin embargo. ... La carga del código dinámico y Haskell son un tanto opuestos el uno del otro. – Evi1M4chine

Cuestiones relacionadas