テキスト ファイルを処理するデータ パイプラインを作成しているとします。次のタイプと機能があります。
data A = A deriving (Show, Typeable)
data B = B deriving (Show, Typeable)
data C = C deriving (Show, Typeable)
data D = D deriving (Show, Typeable)
step1 :: A -> B
step2 :: B -> C
step3 :: C -> D
以下の関数 step{1..3} のそれぞれについて、次のようなことを行って、既存のファイルから新しいファイルを生成できるようにしたいと考えています。
interact (lines . map (show . step . read) . unlines)
次に、それらをグラフに配置して(関数に複数の入力を持たせることができるようにする)、次のことを実現したいと考えています。
データ構造を走査して、どの関数が他のどの関数に入力を提供しているかを判断できます
データ構造はコンパイル時に型チェックを行うため、無効な配置があると型エラーがスローされます。
2 なしで 1 を行う方法 (共通の型クラスを与える) と、1 なしで 2 を行う方法 ((.) を使用するだけ) は知っていますが、両方を同時に行う方法はわかりません。何か案は?ティア。
アップデート
AndrewCの答えはかなり的を射ており、Mapを使用してメタデータ(名前)のグラフを作成し、同時にそれを個別に型チェックできるため、ほとんどの方法でそこに到達できますが、柔軟なポリモーフィズムも必要です。以下の例はこれを解決しますが、2 つの重大な注意事項があります。
- ステップ 4 のパターン マッチングを徹底的に行う必要はありません。
- 面倒です。これらの「BorC」スタイルのポリモーフィック型は、ポリモーフィズムを有効にする以外には何もせず、あまり安全ではありません (1 を参照)。型クラスのメンバー (
Step4Input
と のインスタンスを使用B
)でパターン マッチを試みましC
たが、うまくいきませんでした ( と言いましたCouldn't match type B with C
)。
data BorC = ItsB B | ItsC C
step4 :: BorC -> D
step4 x = case x of { ItsB b -> D; ItsC c -> D }
-- step1 step2
-- \ /
-- ItsB ItsC
-- \ /
-- step4