Hi Daniil, I had a look at the paper and associated code that Oleg refers to there is no special parsing taking place:
From Vector/read-examples.hs: v3 = do let m1 = $(dAM [[1,2],[3,4]]) s <- readFile "Vector/example-data.txt" listMatRow (read s) (\(m2::AVector Double a) -> print $ m2 *> trans m1 ) It does not make any difference if the list that is used to populate the matrix is specified in the code or read from a file. In both cases, if the list lenght is incorrect, an error is generated at run-time (I think, I cannot run the actual code). The TH trickery, that Oleg refers to, is there to solve a different problem: <quote> Note that in each example we print the matrix _inside_ the function argument to the list* functions. We cannot, for instance, just return it, because this causes a universally quantified type to escape: > listVec_ [1,2,3] (\v -> v) <interactive>:1:0: Inferred type is less polymorphic than expected Quantified type variable `n' escapes In the second argument of `listVec', namely `(\ v -> v)' In the definition of `it': it = listVec [1, 2, 3] (\ v -> v) This is why it is not possible to have a function which takes a list and returns a vector of unknown type. The 'fromList' member of the Vector class is only used when we want to turn a list into a vector whose type is known in advance. (see v4 below) </quote> So, in order to play around with matrices of unknown type in GHCi what they do (if I read the code correctly) is to convert the matrix to TH, specifying the exact type, and compiling/splicing it back: liftVec :: (GetType e, Lift e, GetType a, Dom a, Vector v e, GetType (v a)) => v a -> ExpQ liftVec (v::v a) = do es <- lift (elems v) let at = getType (__::a) let et = getType (eltType v) let vt = getType (__::(v a)) return $ (SigE (AppE (VarE $ mkName "fromList") (SigE es (AppT ListT et))) vt ) Crazy haskellers. Is it just me that some time thinks with nostalgia to Apple II Basic? Best, titto On Thursday 28 June 2007 15:38:17 Daniil Elovkov wrote: > 2007/6/28, Pasqualino 'Titto' Assini <[EMAIL PROTECTED]>: > > On Wednesday 27 June 2007 23:28:44 [EMAIL PROTECTED] wrote: > > > In his system, the type of the matrix includes includes the matrix > > > size and dimensions, so invalid operations like improper matrix > > > multiplication can be rejected statically. And yet, his library > > > permits matrices read from files. > > > > Read from files but still at compile time, correct? > > (titto, sorry for dupliate) > > No, what is meant, I believe, is reading from a file at run-time and > parsing this way > > (u :: UnTyped) <- readFromFile > case parse u of > Nothing -> -- failed to parse, because those data wouldn't > satisfy constraints > Just (t::Typed) -> > -- if we're here, we have the typed t, and there are garantees > that it is well formed > -- in terms of our invariants > > parse :: UnTyped -> Maybe Typed > > so deciding whether we have correct data is made at run-time, by > calling parse and examining its return value. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe