[Haskell-cafe] Question about Newtype "op()" function arguments.

Tom Ellis tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk
Fri Jun 7 22:51:50 CEST 2013


On Fri, Jun 07, 2013 at 04:05:09PM -0400, Joe Q wrote:
> The phantom parameter solves the same problem as scoped type variables.
> Granted, if you find yourself in that kind of polymorphic soup you have
> deeper problems...

I don't understand this.  Scoped type variables are used when you want to
use a type variable from the top level within the body of a function.  If
you use "op" and specify a particular constructor then you don't have a
variable but a concrete instance of a type.  But maybe I'm missing some more
powerful way this can be used ...

Tom




> On Jun 7, 2013 2:53 PM, "Tom Ellis" <tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk> wrote:
> > On Fri, Jun 07, 2013 at 07:08:19AM -0700, David Banas wrote:
> > > op :: Newtype<
> > http://hackage.haskell.org/packages/archive/newtype/0.2/doc/html/Control-Newtype.html#t:Newtype
> > >
> > > n
> > > o => (o -> n) -> n ->
> > > oSource<
> > http://hackage.haskell.org/packages/archive/newtype/0.2/doc/html/src/Control-Newtype.html#op
> > >
> > >
> > > This function serves two purposes:
> > >
> > >    1. Giving you the unpack of a newtype without you needing to remember
> > >    the name.
> > >    2. Showing that the first parameter is *completely ignored* on the
> > value
> > >    level, meaning the only reason you pass in the constructor is to
> > provide
> > >    type information. Typeclasses sure are neat.
> > >
> > > As point #2, above, emphasizes, the only purpose for the first argument
> > to
> > > the function (i.e. - the constructor "(o -> n)") is to specify the type
> > of
> > > 'n'. However, being a *newtype*, 'n' can have only one constructor. So,
> > why
> > > is it necessary to pass in the constructor to this function, when we're
> > > already passing in 'n'?
> >
> > I am puzzled by this too.
> >
> > What does "op" stand for?  I hypothesis "opposite" in the sense of inverse,
> > since as Roman points out "op Constructor :: n -> o" is the inverse of
> > "Constructor :: o -> n".
> >
> > But I admit I do not see how this provides value over "unpack" itself.
> >
> > Tom
> >
> > _______________________________________________
> > Haskell-Cafe mailing list
> > Haskell-Cafe at haskell.org
> > http://www.haskell.org/mailman/listinfo/haskell-cafe
> >

> _______________________________________________
> 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