我正在尝试以通用方式匹配数据构造函数,以便执行特定类型的任何任务。
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-instructions,通过该函数构建一个want
由某种状态 monad 处理的要执行的操作列表,以及执行此操作的方法列表(#>)
。该runTask
函数将运行 genericTasks,使用生成的待办事项和如何做的列表,并进行计算。
但是,我在弄清楚如何TaskTypeA,B
从 (#>) 中提取“类型”( ) 以便以后可以调用它时遇到了一些麻烦。如果你做一个:t TaskTypeA
,你会得到一个Int -> Task
。
即,如何写(#>)
?
我也不完全相信有可能以如此通用的方式来做我在想的事情。作为参考,我正在尝试构建类似于Shake
库的东西,其中(#>)
类似于(*>)
. 但是 Shake 使用 String 作为 的参数(*>)
,因此匹配完全使用 String 匹配完成。我想在不需要字符串的情况下做到这一点。