On Sun, 2012-07-08 at 10:27 +0200, Gábor Lehel wrote: > On Sun, Jul 8, 2012 at 3:05 AM, Nicolas Trangez <nico...@incubaid.com> wrote: > > I implemented the inductive alignment calculation over One and Twice > > (good idea, and easy to do), but I don't get the thing about > > superclasses. I've been trying several approaches (including definitions > > based on forall and other trickery I never used before), but didn't get > > things to work, at least: the compiler always said I'd need > > UndecidableInstances, and that sounds scary... Care to elaborate? > > All I meant was > > class (Alignment n, Alignment a) => AlignedToAtLeast n a > > but I got a bit ahead of myself, because that rules out the instance > on tuples.
Maybe that's one of the things I ran into, can't remember OTOH. > (I suppose you *could* write some kind of Alignment > instance for them, taking their minimum or something, but that's > getting a bit too subversive for me). Heh, it already feels evil-but-in-a-good-and-powerful-way to me right now ;-) Thanks for all your input! > The alternative, if you want > both Alignment as a superclass and the ability to constrain multiple > types at once, is to have the above, remove the instance on tuples, > and instead something like: > > class (AlignedToAtLeast n a, AlignedToAtLeast n b) => AlignedToAtLeast2 n a b > instance (AlignedToAtLeast n a, AlignedToAtLeast n b) => AlignedToAtLeast2 n > a b > class (AlignedToAtLeast n a, AlignedToAtLeast n b, AlignedToAtLeast n > c) => AlignedToAtLeast3 n a b c > instance (AlignedToAtLeast n a, AlignedToAtLeast n b, AlignedToAtLeast > n c) => AlignedToAtLeast3 n a b c > (feel free to think of better names!) > > unsafeXorSSE42 :: (Storable a, SV.AlignedToAtLeast3 SV.A16 o1 o2 o3) > => SV.Vector o1 a -> SV.Vector o2 a -> SV.Vector o3 a Implemented in [1]. Code says unsafeXorSSE42 :: (Storable a, SV.AlignedToAtLeast3 SV.A16 o1 o2 o3) => SV.Vector o1 a -> SV.Vector o2 a -> SV.Vector o3 a ghci says unsafeXorSSE42 :: (AlignedToAtLeast (Data.Vector.SIMD.Mutable.Twice A8) o2, AlignedToAtLeast (Data.Vector.SIMD.Mutable.Twice A8) o1, AlignedToAtLeast (Data.Vector.SIMD.Mutable.Twice A8) o3, Foreign.Storable.Storable a) => Vector o1 a -> Vector o2 a -> Vector o3 a which is the same thing, so should do. > That will require UndecidableInstances, but all that means is that GHC > can't prove to itself that instance checking will terminate. So you > could end up getting the compiler into an infinite loop (or in > practice, to exceed its recursion limit). But it doesn't allow > anything unsafe to happen at runtime, and there's plenty of perfectly > good instances which terminate even if GHC can't prove it. I see. I had some rather unsafe/undecidable-by-a-developer things in mind, but I guess I should read up on some of the language extensions GHC provides. Thanks, Nicolas [1] https://github.com/NicolasT/vector-simd/commit/8f934891c9630a96ce009fafa7f6ba70df306d4f _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe