2011-08-03 29 views
11

Haskell işlevlerini serileştirmenin (okuma/gösterme) bir yolu var mı? genel olarak (Haskell'de fonksiyonların seri hale getirilmesi

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

Bu Lisp lehçeleri parlayacak bir alan tam da budur. –

+4

Haskell - Persistent Haskell'in erken bir varyantı - izin verilen fonksiyonların serileştirilmesi. Sürekli olarak Napier88 için St. Andrews Üniversitesi'nde (İskoçya) geliştirilen teknolojiye bağlı olarak herkesin elinden geldiğinden emin değilim. Bunu yakından okumamıştım, ancak "Bulutta Haskell'e Doğru" adlı son makalede, dağıtılmış programlama için serileştirme işlevlerinin ana hat GHC'de başlatılmış olabileceği önerisi var gibi görünüyor. –

+3

Gerçekten, ghc için yapılan serileştirme işlevleri üzerinde çalışma var, ancak sınırlı bir tür olacak. – augustss

cevap

6

Çalışma zamanında kodu okumak için plugins paketi gibi bir şey kullanabilirsiniz. Gösteren, augustss'in dediği gibi, imkansız.

o nasıl kullanılabileceğine bir örnek:

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

Bazı kod örnekleri verebilir misiniz? – Roskoto

+0

Yanıt için bir kullanım örneği eklendi. – valderman

+0

Ayrıca, Hint paketi de farklılıklar var. – gatoatigrado

10

O var: Ne yazık ki bu bir hata atar

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

:

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

ben gibi bir şey var edebilmek istiyoruz: Örneğin

göz önüne alındığında) Bir fonksiyonu göstermesi imkansızdır, ancak bir Haskell derleyicinizin ruda bulunması durumunda prensipte okumak mümkündür. ntime.

+0

Bazı kod örnekleri – Roskoto

+1

Kod örnekleri verebilir misiniz? Bir Haskell derleyicisi? – augustss

+0

Bu kesinlikle imkansız değil. Orijinal kaynağı, herhangi bir derleyici içsel gösterimi veya tercihen makine bağımsız bir bayt kodu gösterebilirsiniz. Bu, dinamik yükleyici veya eklenti paketi kullanılarak tekrar aktarılabilir ve okunabilir. … Güzel olacağını söylemedim. … Dinamik kod yükleme ve Haskell birbirinin kesişenleridir. – Evi1M4chine

İlgili konular