[Haskell-cafe] Construction of short vectors
Alexey Khudyakov
alexey.skladnoy at gmail.com
Sun Jun 27 15:29:44 EDT 2010
On Sun, 27 Jun 2010 19:55:21 +1000
Roman Leshchinskiy <rl at cse.unsw.edu.au> wrote:
> On 25/06/2010, at 06:41, Alexey Khudyakov wrote:
>
> > Then constructor like one below arise naturally. And I don't know how to write
> > them properly. It's possible to use fromList but then list could be allocated
> > which is obviously wasteful.
> >
> >> vector2 :: Double -> Double -> Vec2D
> >> vector2 x y = ...
> >> -- Vec2D is some wrapper around Vector data type
>
> Your best bet is probably singleton x ++ singleton y. Unfortunately, GHC
> doesn't seem to provide any real way of specifying array literals.
>
Thank you for advice. And what about using ST monad?
> vector2 :: Double -> Double -> Vec2D
> vector2 x y = Vec2D $ create $ do a <- new 2
> write a 0 x
> write a 1 y
> return a
> > Another question is there any specific problems with short vectors? They
> > could be just 2 elements long. I mean performance problems
>
> A data type like this one should be faster:
>
> data Vec2D = Vec2D {-# UNPACK #-} !Double {-# UNPACK #-} !Double
>
> Firstly, this needs one less indirection for accessing the
> components. Secondly, GHC's simplifier knows a lot more about algebraic data
> types than it does about arrays so the above definition will often lead to
> better optimisations. Whether or not the difference is significant probably
> depends on the program.
>
This is of course faster but what I really want is vectors with length
parametrized by type. This way I can write generic code. Uniform
representation is requirement for that.
--
Alexey Khudyakov <alexey.skladnoy at gmail.com>
More information about the Haskell-Cafe
mailing list