我想对一组数据做一些不同的计算。这些计算有一些常见的子计算,最终会被重新评估,所以我想要做的是建立一个“复合计算”,它可以同时完成所有事情并共享数据。我觉得这有一个monad,但我不知道它的名字。
我真的对这个抽象方面很感兴趣,但是实际情况不那么模糊如下:我有一个2D网格,我正在进行模拟,因此我正在计算局部值(衍生物)等)使用模板然后将它们组合起来以及时向前迈进模拟。这是一个简单的例子:
import Data.Array.Accelerate
type Local = Stencil3x3 Double -> Exp Double
convect :: Local
convect s@((_,t,_),(l,c,r),(_,b,_)) =
c+c0*(dx s +dy s)
where c0 = 1e-2
dx :: Local
dx ((_,t,_),(l,c,r),(_,b,_)) = 0.5*(l-r)
(但我可以很容易地不在这里使用Accelerate和模板。)
我知道我可以将这一切都归结为一个功能,但这不会非常优雅或者可以恢复或者具有可靠性。
我能告诉convect
是否有一个很好的方式,“我会想要这些价值观,请立即将它们全部拿出来”?