2011-08-03 19 views
11

Czy istnieje sposób na serializację (odczyt/pokaz) funkcji w Haskell?Serializacja funkcji w Haskell

Na przykład biorąc pod uwagę, że:

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

Chciałbym móc mieć coś takiego:

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

niestety wyrzuca błąd:

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

To właśnie obszar, w którym Lisp dialekty świecić. –

+4

Wczesny wariant Haskella - Utrwalony Haskell - dozwolone funkcje do serializowania. Nie jestem pewien, czy kiedykolwiek był on publicznie dostępny, ponieważ zależał od technologii opracowanej na Uniwersytecie St. Andrews w Szkocji w związku z uporczywym językiem Napier88. Nie czytałem tego dokładnie, ale najnowszy artykuł "W stronę Haskella w chmurze" zdaje się sugerować, że prace nad funkcjami serializacyjnymi dla programowania rozproszonego mogły rozpocząć się w głównej linii GHC. –

+3

Jest rzeczywiście praca nad serializowaniem funkcji dla ghc, ale będzie ona ograniczona. – augustss

Odpowiedz

6

Możesz użyć czegoś takiego jak pakiet plugins do odczytu kodu w czasie wykonywania. Pokazanie jest jednak, jak twierdzi, niemożliwe.

Przykładem jak to może być stosowane:

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

Czy możesz podać przykłady kodu? – Roskoto

+0

Dodano przykład użycia do odpowiedzi. – valderman

+0

Istnieje również pakiet podpowiedzi, nie wiem jednak, jakie są różnice. – gatoatigrado

10

To (w ogóle) niemożliwe do pokazania funkcji, ale czytanie z nich jest zasadniczo możliwe, jeśli masz kompilator Haskell dostępny w ru ntime.

+0

Czy możesz podać kilka próbek kodu? – Roskoto

+1

Próbki kodu? Z kompilatora Haskell? – augustss

+0

Z pewnością nie jest to niemożliwe. Możesz "pokazać" oryginalne źródło, dowolną wewnętrzną reprezentację kompilatora, lub najlepiej jakikolwiek niezależny od urządzenia kod bajtowy. Można go przenieść i wczytać ponownie za pomocą pakietu 'dynamic-loader' lub' plugins'. ... Nie powiedziałem, że byłoby to całkiem miłe. ... Dynamiczne ładowanie kodu i Haskell są dla siebie przeciwieństwem. – Evi1M4chine