2010-12-14 8 views
6

私はフローチャートとして表現されたアルゴリズム(主にビジネスロジックスタイル)を実装するタスクに直面しています。私はフローチャートがそのスパゲッティコードプロパティ(これはCPSのユースケースですか?)のために最良のアルゴリズム表現ではないことを知っていますが、私はフローチャートとして表現された仕様に固執しています。Haskellのフローチャート指定のアルゴリズムを表す

私は、フローチャートを実装する前により適切な同等の表現に変換することができましたが、その結果実装の元のフローチャートを「認識」するのが難しくなる可能性があるため、フローチャートを直接表現する方法があると考えましたハスケルの(おそらくモナディックな)EDSLとしてのアルゴリズムを使用しているので、オリジナルのフローチャート仕様に類似していることが分かります。

答えて

4

フローチャートの可能な表現の1つは、「ステップXへ進む」を「状態Sの関数Xを評価する」に変換することによって、相互に末尾再帰関数のグループを使用することです。読みやすさを向上させるために、アクション(状態を変更する外部関数)とif/elseの連鎖、または次のステップを決定するのに役立つパターンマッチングの両方の機能を組み合わせることができます。

これはもちろん、(外部ソースから実行時に読み込まれるのではなく)フローチャートがハードコードされていることを前提としています。

+0

私は元の質問では書いていませんでしたが、これは私が今より優れたアイデアが欠けているようにしています(私は末尾再帰サポートでどんな言語でもできます)。何かより多くのハスケル・イッシュ。はい、彼らはハードコード化されていると思われます – hvr

+0

@ hvr、私はこの考えがきれいで、かなり直接的なエンコーディングだと思います。 Haskellishプログラムは制御フローに関して考えていないので、あなたはHaskellishソリューションから自分自身を定義しました。 – luqui

1

Arrowsのようなサウンドは、あなたの説明に正確に合います。矢印の視覚化(非常にシンプルでなければならない)や、必要であればフローグラフからの矢印コードの生成/変換。

+1

ここでは矢印が気になるでしょう - フローチャートは*制御フロー* - 矢印キャプチャ*データフロー*です。 – sclv

1

フローチャート内に「グローバル」状態があるとすると、それは状態モナドにパッケージ化する意味があります。少なくとも今、あなたは今それをやっているのとは違って、各呼び出しにはパラメータが必要ないので、a)状態の変更、b)状態の現在の状態のジャンプ、b)読み込みができます。

関連する問題