特定のタイプのタスクが実行されるように、一般的な方法でデータ コンストラクターを一致させようとしています。
data Task = TaskTypeA Int | TaskTypeB (Float,Float)
genericTasks :: StateLikeMonad s
genericTasks = do
want (TaskTypeA 5)
TaskTypeA #> \input -> do
want (TaskTypeB (1.2,4.3))
runTaskTypeA input
TaskTypeB #> \(x,y) -> runTaskTypeB x y
main = runTask genericTasks
この中で、genericTasks
関数は do 命令を通過し、want
何らかの状態モナドによって処理されるもののリストと、(#>)
関数を介してそれを行う方法のリストを構築します。このrunTask
関数は genericTasks を実行し、結果の to-do と how-to-do のリストを使用して計算を行います。
TaskTypeA,B
ただし、後で呼び出すことができるように、(#>) から「タイプ」( ) を抽出する方法を理解するのにかなり苦労しています。を実行する:t TaskTypeA
と、 が得られますInt -> Task
。
つまり、どのように書くの(#>)
ですか?
また、私がここで考えていることをそのような一般的な方法で行うことが可能であると完全に確信しているわけではありません. Shake
参考までに、ライブラリに(#>)
似たものを構築しようとしてい(*>)
ます。ただし、Shake は への引数として String を使用する(*>)
ため、マッチングは完全に String マッチングを使用して行われます。文字列を必要とせずにやりたいです。