最近我开始使用 Haskell 的 Repa 库,它严重依赖于类型族和相关类型。我可以像这样定义一个 Repa 数组:
ghci> let x = fromListUnboxed (Z :. (5 :: Int) :. (2 :: Int)) [1..10]
并像这样操作它:
ghci> computeP $ R.map id x :: IO (Array U DIM2 Double)
AUnboxed ((Z :. 5) :. 2) (fromList [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0])
其中 U 是一个关联的数据类型,它将导致结果被表示为一个未装箱的数组;DIM2 是数组维度。我不喜欢我必须指定一个具体的尺寸,即使它可以被推断出来。相反,我想写这样的东西:
ghci> computeP $ R.map id x :: Shape sh => IO (Array U sh Double)
这是无效的,但我的意图是能够通过传递适当的关联数据类型(本例中为 U)来指定数组类型,但保持形状不变。这样的事情可能吗?