2011-02-20 15 views
4

私は、実行する文字列からHaskell関数をロードする方法を探しています。私は手前の型を知っていますが、関数の内容は知らないのです。動的なhaskellモジュールをロードする

理想的には、ソリューションは迅速でIOで実行する必要はありません。

私はヒント(Language.Haskell.Interpreter)を見てきましたが、請求書に適合しません(評価はshow、モジュールはファイルでなければなりません)。

ご協力いただければ幸いです。

+0

私はhttp://stackoverflow.com/questions/712696/is-there-a-quick-starting-haskell-interpreter-suitable-for-scriptingを読んでいるが、unhelpedました – amccausl

+1

静的で安全性を重視する言語の中で、「eval」を求めていますか?どのように楽しく皮肉な... – delnan

+1

必ずしもそうではありません。純度とサンドボックスを構築する言語は、動的コンパイルの偉大な言語のように思えます。 – amccausl

答えて

3

hintおよびpluginsが主な選択肢です。 hintは、関数をバイトコードとして解釈させ、pluginsはコンパイル済みオブジェクトコードを使用します。

これらの 'eval'関数は実行前に型チェックされなければならないので、評価は型エラーで失敗する可能性があるため、純粋な値であることはめったにありません。あなたが私にはわからない、それを行うことになっているどのように地球上の

+1

ヒントはいずれかのタイプを使用してエラーをエンコードするので、純粋である必要があります。 – amccausl

+0

[hack on hackage](http://hackage.haskell.org/package/hint)。 –

+0

ヒントは実際に問題のライブラリの全コンテンツとスコープ内のモジュールをリロードします。それにはIOが必要です。 – Carl

-1

抽象的な答えはあなただけ(あなたがそれをしている間、おそらくShow(->)Readのインスタンスを作る必要があるということです

。コードを解釈するのは小さな仕事ではありません。

単純な関数を扱う場合は、それらを表す代数的データ型を作成することをお勧めします。

data Fun = Add | Subtract | Multiply deriving (Eq, Show, Read) 

runFun Add  = (+) 
runFun Subtract = (-) 
runFun Multiply = (*) 

*Main> runFun (read "Add") 2 3 
5 
*Main> runFun (read "Multiply") 2 3 
6 
*Main> runFun (read "Subtract") 2 3 
-1 
関連する問題