在inline-c包中,有一个example调用来自Haskell的C库GNU Scientific gsl。
solveOde fun x0 f0 xend =
  coerce $ solveOdeC (coerce fun) (coerce x0) (coerce f0) (coerce xend)我试图在Haskell中包装更多的gsl,并且我试图理解示例代码的每一行。那么它为什么在这里使用Data.Coerce呢?
发布于 2021-05-03 04:46:03
solveOdeC的类型与solveOde的类型几乎相同。前一种类型在多个点上涉及CDouble,包括在Vectors和Either内部。后者改用Double。
代码依赖于具有相同表示的CDouble和Double。正因为如此,使用coerce可以通过简单地调用另一个函数来定义函数,而不需要运行时开销。否则,将需要创建一个新的Vector,它将按位与第一个相同,只是为了满足类型检查器,为此开销为O(N)。
老实说,我发现库中的定义不必要地冗长。人们可以写下,相反,
solveOde = coerce solveOdeChttps://stackoverflow.com/questions/67360657
复制相似问题