不,这是不可能的。
如果您Array
基于JArray
并想要一个仿函数实例,则不得使用任何产生 ArrayElem(或任何其他附加)上下文的函数。
另一种说法是,您不能Array
基于类型安全的 java 数组,而必须处理 type 的 java 数组Object[]
。因为,正如您毫无疑问地指出的那样,ArrayElem
类型类只是能够在创建 java 数组时提供正确的 java 类型的技巧。当然,这对于与 Java 的接口和性能原因很重要。
请注意,类型安全的 java 数组还有另一个问题。假设我们想要创建一个数组Double
(但相同的参数适用于任何其他元素类型)。AFAIK,Haskell 要求 Arrays 元素必须是惰性的。因此,我们真的不能使用 java 类型double[]
(JArray Double
与 Frege 对应的类型)对其进行建模。因为,如果我们这样做,每个数组元素都必须在设置后立即进行评估。
出于这个原因,我建议你使用一些通用的自定义数组元素类型,比如
data AElem a = AE () a
mkAE = A ()
unAE (AE _ x) = x
derive ArrayElement AElem
并更改您的定义:
data Array i e = Array{u,l::i,n::Int,elems::(JArray (AElem e))}
现在,您的仿函数实例可以编写,因为不会出现 ArrayElem 约束,因为当您访问elems
数组时,编译器知道您有AElem
元素并且可以并且将提供正确的实例。
此外,s 的构造AElem
和将AElem
s 用作实际数组元素不会对实际值施加严格限制。
不用说,Array 模块的用户不应该(不需要)知道那些实现细节,也就是AElem
类型。