让UArray成为一个Functor

时间:2015-04-20 22:41:39

标签: haskell

我想将UArray视为Functor的实例。我想写一个数字代码,我需要使用比Array更有效的东西来表示状态(说明分析器)。我知道我可以在不使用仿函数的情况下编写代码,但我认为仿函数是我非常有价值的抽象概念。

按原样这不起作用,因为UArray只是某些基本类型IArrayInt的{​​{1}}个实例。我正在考虑两种让它继续工作的方法:

  • 如果Double的结果不是fmap
  • 的实例,则会隐式或显式地返回错误
  • 定义“复合”类型,该类型基于IArray(如果可能)或基于UArray(如果不是),类似于C ++模板专业化

我尝试过基于各种GHC扩展的各种方法(存在类型,函数依赖,广义代数数据类型,多参数类型类,不可判断的实例),但我无法使事情发挥作用。我总是到达一个我需要向编译器承诺“是的,结果可以通过Array表示”的点,但是它没有语法。

我已经阅读了上面GHC扩展的各种论文,教程和文档,希望找到一个告诉我如何做到这一点的例子。我能找到的最接近的是https://wiki.haskell.org/GADTs_for_dummies,它定义了一个非常接近我可能需要的类UArray

你能给我一个如何开始的指针吗?

1 个答案:

答案 0 :(得分:1)

Data.Vector.Unboxed提供了我正在寻找的实现。它已经是Functor的一个实例,并在可能的情况下自动选择有效的表示。