[Haskell-cafe] Re: Implementing fixed-sized vectors (using
datatype algebra?)
Alfonso Acosta
alfonso.acosta at gmail.com
Wed Feb 20 03:20:19 EST 2008
OK I'll include the module after I change the things mentioned.
BTW, I finally have an initial version of the parameterized-data package:
Darcs repository:
http://code.haskell.org/parameterized-data
Haddock documentation:
http://code.haskell.org/~fons/parameterized-data/doc/
Any comments/suggestions would be appreciated.
To fix the problem of the "vector" constructor I included a Template
Haskell variant. It is quite simple to use:
$ ghci -XTemplateHaskell
Prelude> :m +Data.Param
Prelude Data.Param> $(vectorTH [1 :: Int, 2, 3, 4])
Prelude Data.Param> :t $(vectorTH [1 :: Int, 2, 3, 4])
(vectorTH [1 :: Int, 2, 3, 4]) :: (Num t) => FSVec Data.TypeLevel.Num.Reps.D4 t
Note that the size parameter (type-level decimal numeral) is correct.
It would be nice to be able to use a Quasiquoter [1] (available in GHC
HEAD) to enable pattern matching and custom syntax to Vector literals.
However, I was bitten by a polymorphism problem when implementing it:
see [2] for details
[1] http://www.haskell.org/ghc/dist/current/docs/users_guide/template-haskell.html#th-quasiquotation
[2] http://www.haskell.org/pipermail/template-haskell/2008-February/000655.html
On Wed, Feb 20, 2008 at 2:26 AM, Wolfgang Jeltsch
<g9ks157k at acme.softbase.org> wrote:
> Am Mittwoch, 20. Februar 2008 00:39 schrieben Sie:
>
> > Why are the value-level reflecting functionsimplemented as type-class
> > methods? It makes the code more verbose and I don't see any advantage
> > compared to simply defining a function per class. Let me show you an
> > example:
> >
> > This is your implementation of Not:
> >
> > class (Boolean boolean, Boolean boolean') =>
> > Not boolean boolean' | boolean -> boolean', boolean' -> boolean
> > where not :: boolean -> boolean'
> >
> > instance Not False True where
> > not _ = true
> >
> > instance Not True False where
> > not _ = false
> >
> > This is how I would do it:
> >
> > class (Boolean boolean, Boolean boolean') =>
> > Not boolean boolean' | boolean -> boolean', boolean' -> boolean
> > where
> >
> > instance Not False True
> > instance Not True False
> >
> > not :: Not a b => a -> b
> > not = undefined
>
> Your definition of the not function uses the implementation detail that false
> and true are actually undefined. My implementation of the not function also
> works if false and true are defined to be something different. Of course,
> false and true are in the same library, so we know this implementation detail
> and could make use of it.
>
>
> > Furthermore, why did you choose to use Boolean instead of simply Bool?
>
> To avoid a name clash. Feel free to change this.
>
> Note that False and True don't cause a name clash since they live in a
> namespace different from the one Prelude's False and True live in.
>
> > Cheers,
> >
> > Fons
>
>
>
> Best wishes,
> Wolfgang
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list