[Haskell-cafe] Re: hmatrix
Alberto Ruiz
aruiz at um.es
Thu Jun 5 11:16:09 EDT 2008
Hello Bulat and Anatoly,
I have written a first version of an interface to inplace updates in the
ST monad for the hmatrix vectors and matrices. Many things must be
improved (range checking, documentation, etc.) but I hope that the
general idea makes sense.
A few usage examples:
http://perception.inf.um.es/~aruiz/darcs/hmatrix/examples/inplace.hs
Code:
http://perception.inf.um.es/~aruiz/darcs/hmatrix/lib/Data/Packed/ST.hs
http://perception.inf.um.es/~aruiz/darcs/hmatrix/doc/html/Data-Packed-ST.html
Any suggestion will be welcome. I'm impressed by the power of the ST
monad, it is extremely useful and elegant. Thank you again for your help!
In the future I will also try to include efficient conversions to/from
standard Haskell arrays and those of other related libraries like Jed
Brown's CArray.
Thanks,
Alberto
Bulat Ziganshin wrote:
> Hello Alberto,
>
> Tuesday, June 3, 2008, 12:56:50 PM, you wrote:
>
>> Good! So you can easily "hide" the IO operations in the ST monad. I will
>> definitely look into it.
>
> from implementation POV ST monad is nothing but renamed IO monad which
> exports only subset of its operations which are guaranteed to safe.
> or, saying in other words, it's just type hackery around IO monad that
> provides safe operations
>
> it's possible to define ST monad and its operations as following:
>
> newtype ST s a = forall s. ST_Constructor (IO a)
>
> unsafeIOtoSt action = ST_Constructor action
>
> runST (ST_Constructor action) = unsafePerformIO action
>
> newtype STRef s a = forall s. STRef (IORef a)
>
> readSTRef (STRef ref) = unsafeIOtoSt (readIORef ref)
>
> and so on. GHC uses technically (but not ideologically!) different
> implementation where both monads are specializations of one generic
> type. while Hugs afair uses exactly this approach. you may also look
> at ArrayRef lib which reimplements arrays/refs for both compilers in
> more unified way
>
> anyway, because ST is just IO monad modulo type tricks, you can
> execute any IO action inside ST by lifting it with unsafeIOtoSt
>
More information about the Haskell-Cafe
mailing list