
* David Banas
Hi All,
Referring to the following, which is taken from the *Control.Newtype *documentation page:
op :: Newtypehttp://hackage.haskell.org/packages/archive/newtype/0.2/doc/html/Control-New... n o => (o -> n) -> n -> oSourcehttp://hackage.haskell.org/packages/archive/newtype/0.2/doc/html/src/Control...
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'?
Hi David, Note that that argument is in fact not necessary — 'op' without its first argument is exactly 'unpack'. I imagine that 'op' may be useful if you need to disambiguate the instance in an otherwise ambiguous context. One way to do this is, of course, to provide an explicit type signature, but passing a constructor is another, and rather elegant, way to achieve that. I am not a heavy user of the newtype package, so I can't say how often this situation occurs in practice. Roman