簡単な計算グラフを評価したいと思います。すべての非ターミナル ノードに 2 つの依存関係がある計算グラフのコードを作成することができました (これは任意の固定数の依存関係に簡単に拡張できます)。
{-# LANGUAGE ExistentialQuantification #-}
module Graph where
-- Have:
data Node a =
forall u v . CalculationNode { f :: u -> v -> a
, dependencies :: (Node u, Node v) }
| TerminalNode { value :: a }
eval :: Node a -> a
eval (CalculationNode f (d1, d2)) = f (eval d1) (eval d2)
eval (TerminalNode v) = v
three :: Node Int
three = TerminalNode 3
abcd :: Node String
abcd = TerminalNode "abcd"
seven :: Node Int
seven = CalculationNode (\ s i -> i + length s) (abcd, three)
問題は、メモが任意の数の依存関係を取得できるように、このコードを拡張するにはどうすればよいかということです。
何かのようなもの:
data Node a =
forall u_1 u_2 ... u_n . CalculationNode { f :: u_1 -> u_2 -> ... -> u_n -> a
, dependencies :: (Node u_1, Node u_2, ... , Node u_n) }
| TerminalNode { value :: a }
eval :: Node a -> a
eval = ?
これには typefamily/hlist ソーサリーが必要だと思いますが、どこから始めればよいかさえわかりません。解決策とヒントを歓迎します。