2011-08-03 5 views
11

Existe-t-il un moyen de sérialiser (lire/afficher) des fonctions dans Haskell?Sérialisation des fonctions dans Haskell

Par exemple étant donné que:

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

Je veux être en mesure d'avoir quelque chose comme:

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

Malheureusement, cela renvoie une erreur:

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

C'est précisément une zone où les dialectes Lisp brillent. –

+4

Une première variante de Haskell - Haskell persistant - permet de sérialiser les fonctions. Je ne suis pas sûr si c'était disponible publiquement car cela dépendait de la technologie développée à l'Université St. Andrews (Ecosse) pour le langage persistant Napier88. Je ne l'ai pas lu de près, mais le récent article "Vers Haskell dans le nuage" semble suggérer que le travail sur les fonctions de sérialisation pour la programmation distribuée pourrait avoir commencé dans le GHC principal. –

+3

Il y a effectivement du travail sur les fonctions de sérialisation en cours pour ghc, mais ce sera limité. – augustss

Répondre

6

Vous pouvez utiliser quelque chose comme le package plugins pour lire du code lors de l'exécution. L'affichage est, comme le dit augustes, impossible cependant.

Un exemple de la façon dont il pourrait être utilisé:

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

Pourriez-vous s'il vous plaît fournir des exemples de code – Roskoto

+0

Ajout d'un exemple d'utilisation à la réponse. – valderman

+0

Il y a aussi le paquet Hint, sans savoir quelles sont les différences. – gatoatigrado

10

Il est (en général) impossible de montrer une fonction, mais en lire une est possible en principe si vous avez un compilateur Haskell disponible à ru ntime.

+0

Pourriez-vous s'il vous plaît fournir des exemples de code – Roskoto

+1

Exemples de code? D'un compilateur Haskell? – augustss

+0

Ce n'est certainement pas impossible. Vous pouvez 'montrer 'la source originale, n'importe quelle représentation interne au compilateur, ou de préférence un bytecode indépendant de la machine. Ceci peut être transféré et réintégré en utilisant le paquet' dynamic-loader' ou 'plugins'. ... Je n'ai pas dit que ce serait joli. ... Le chargement de code dynamique et Haskell sont un peu opposés les uns des autres. – Evi1M4chine

Questions connexes