【发布时间】:2013-07-19 13:55:45
【问题描述】:
我正在尝试以通用方式匹配数据构造函数,以便执行特定类型的任何任务。
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 构建由某种状态单子处理的待办事项列表,以及通过 @987654324 处理的方法列表@ 功能。 runTask 函数将运行 genericTasks,使用生成的待办事项和操作方法列表,并进行计算。
但是,我在弄清楚如何从 (#>) 中提取“类型”(TaskTypeA,B) 以便以后调用它时遇到了一些麻烦。如果你做一个:t TaskTypeA,你会得到一个Int -> Task。
即(#>)怎么写?
我也不完全相信有可能以如此通用的方式来做我在想的事情。作为参考,我正在尝试构建类似于Shake 库的东西,其中(#>) 类似于(*>)。但是 Shake 使用字符串作为 (*>) 的参数,因此匹配完全使用字符串匹配完成。我想在不需要字符串的情况下这样做。
【问题讨论】:
-
这是我第一次尝试 SO,如果有什么需要澄清的,请告诉我。我也是 Haskell 的新手,但这让我比平时更难受——不幸的是,这通常意味着它不像我想象的那样完全可行。