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...
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@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe