On 2021-04-16, at 02:27, Albert Y. C. Lai <trebla@vex.net> wrote:On 2021-04-15 8:54 a.m., YueCompl via Haskell-Cafe wrote:_______________________________________________
-- * Things not workingmanagedArrayAsSeries :: SomeManagedArray -> IO DynamicmanagedArrayAsSeries (SomeManagedArray ma) = dovec <- doSomeArray cap fp <- arrayAtTheMoment mareturn $ VS.unsafeFromForeignPtr0 fp caplet len = return $ VS.length vecrs i = return $ vec VS.! ireturn $ toDyn $ Series len rsThat means you have this code fragment:
arrayAtTheMoment ma >>= \(SomeArray cap fp) -> return $ VS.unsafeFromForeignPtr0 fp capThat means you have this function:
\(SomeArray cap fp) -> return $ VS.unsafeFromForeignPtr0 fp capNow you are violating the 1st restriction at
https://downloads.haskell.org/ghc/latest/docs/html/users_guide/exts/existential_quantification.html#restrictionsThere are two solutions.
1st solution: One more existential type.
data Vec = forall a. (Typeable a, VS.Storable a) => Vec (VS.Vector a) Vec vec <- do SomeArray cap fp <- arrayAtTheMoment ma return (Vec (VS.unsafeFromForeignPtr0 fp cap))2nd solution: CPS transform.
{-# language RankNTypes #-} {-# language BlockArguments #-} withSomeArray :: SomeArray -> (forall a. (Typeable a, VS.Storable a) => Int -> ForeignPtr a -> r) -> r withSomeArray (SomeArray i p) f = f i p sa <- arrayAtTheMoment ma withSomeArray sa \cap fp -> do let vec = VS.unsafeFromForeignPtr0 fp cap -- or if you prefer: vec <- return (VS.unsafeFromForeignPtr0 fp cap) len = return (VS.length vec) rs i = return (vec VS.! i) etc.
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.