[Haskell-cafe] Re: hmatrix

Anatoly Yakovenko aeyakovenko at gmail.com
Thu Jun 5 13:28:50 EDT 2008


Thanks, that's exactly what i was looking for.

On Thu, Jun 5, 2008 at 8:16 AM, Alberto Ruiz <aruiz at um.es> wrote:
> 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