9

離散数学を解くための私のプログラムでは、ユーザーが一連の論理演算を入力できるようにしたいと考えています。たとえば、ユーザーが を入力すると、プログラムの残りの部分で使用let f (x:y:_) = x && yする関数が得られます。fGHCi では、 と入力するだけで簡単にプログラムをテストできますlet f (x:y:_) = x && y

このタスクを達成する方法がわかりません。evalパッケージから関数を調べましたpluginsが、正しい関数ではないようです。Haskellでこれを行うことはできますか?

これを使用する予定のコードは次のとおりです。

type TruthTable = [[Bool]]
type TruthTableResult = [([Bool], Bool)]

solveTable :: ([Bool] -> Bool) -> Integer -> (TruthTableResult)
solveTable f n = let table = truthTable n
                     result = map f table
                 in  zipWith (\v r -> (v, r)) table result
4

3 に答える 3

10

eval実行時メタプログラミングの形式である関数を作成しています。

eval :: String -> a

文字列が Haskell プログラムを表している場合は、文字列を解析し、型をチェックしてから、ターゲットのインタープリターまたはランタイムにコンパイルする必要があります。これには、ランタイム サービス (インタープリター内) または別のパッケージ (コンパイラーの場合) としてエクスポートされたライブラリーとしてコンパイラーにアクセスする必要があります。

Haskell の GHC 実装には、Haskell コードの実行時評価を行うためのライブラリがいくつかあります。

これらは、入力言語が Haskell の場合にのみ適用されます。

代わりに、入力文字列が他の言語のプログラムを表している場合は、DSL インタープリターを探しています。これは、入力言語用に独自のインタープリターを作成する (または共通言語の場合はライブラリーを再利用する) ことで実行できます。

于 2013-09-16T07:19:47.850 に答える
5

手短に言えば、Haskell には "eval" 関数がなく、これを非常に簡単に実行できるインタープリター言語とは異なります (結局のところ、インタープリターは手元にあり、既に実行されています)。

Haskell コンパイラをライブラリとして含めることができます: http://www.haskell.org/haskellwiki/GHC/As_a_libraryを参照してください。これはあなたが求めるものに最も近いものです。

ただし、ここに Haskell 全体を入れたくないようです。あなたが本当に望んでいるのは、Haskell のような構文を持つかもしれないが、Haskell 全体ではない別の言語です。もしそうなら、本当の解決策はその言語を定義してパーサーを書くことです。Parsecライブラリは、その出発点です。

于 2013-09-16T06:26:32.253 に答える