
Hello Tom, Basically, I follow what you have written but ... We have
Prelude> :k Data.Array.Unboxed.UArray Data.Array.Unboxed.UArray :: * -> * -> *
which is why I tried my first naive solution. I note that we have also
Prelude> :k Data.Array.IArray.IArray Data.Array.IArray.IArray :: (* -> * -> *) -> * -> Constraint
This last one I do not follow. A short explanation and/or a pointer to some documentation would help. Thanks, - Marcus On 21/02/2014 09:47, Tom Ellis wrote:
On Thu, Feb 20, 2014 at 10:12:54PM +0100, Marcus D. Gabriel wrote:
Hello,
I wanted to make a simple Data.Foldable UArray, and I naively modelled it on
instance Ix i => Foldable (Array i) where foldr f z = Prelude.foldr f z . elems with, of course,
instance Ix i => Foldable (UArray i) where foldr f z = Prelude.foldr f z . elems which did not work yielding the following type message
Could not deduce (IArray UArray a) arising from a use of `elems' [...]
The problem is that the argument 'e' in 'UArray i e' is a phantom type argument used only for looking up the relevant instance of 'IArray'. It doesn't actually have anything to do with the underlying contents of the array, which is basically just a 'ByteString'.
Since all 'Foldable' functions factor through 'toList', you can't go too wrong by using '(foldableFunction . toList) myArray' wherever you would have wanted to use 'foldableFunction myArray'.
Tom