[Haskell-cafe] difference between type and newtype

Udo Stenzel u.stenzel at web.de
Sat Aug 26 08:47:11 EDT 2006


Andrea Rossato wrote:
> this is what I'm trying to do, sort of: turn the code at the button
> into the do-notation.[1]
 
> type MSO a = State -> (a, State, Output)
> 
> mkMSO :: a -> MSO a
> mkMSO a = \s -> (a, s, "")
> 
> bindMSO :: MSO a -> (a -> MSO b) -> MSO b
> bindMSO m f = \x -> 
>              let (a, y, s1) = m x in
>              let (b, z, s2) = f a y in
>              (b, z, s1 ++ s2)

In principle (might need glasgow-exts), you could go ahead and declare

instance Monad MSO where
	return = mkMSO
	(>>=) = bindMSO

This doesn't work, because MSO ist just a function (the top type
constructor is (->)), and there is already a Monad instance for (->).
You could activate all sorts of extensions (glasgow-exts and
overlapping-instances at the very least) to allow the overlap, but I
guess, this will only serve to confuse first the type checker and later
you.

Instead, you have to make clear that MSO is represented as a function,
but is to be treated as different, and that's what 'newtype' is for.
After wrapping a function in a newtype, it is something else, so it has
to be unwrapped before it can be used as a function again:

> newtype MSO a = MSO { unMSO :: State -> (a, State, Output) }
> 
> mkMSO :: a -> MSO a
> mkMSO a = MSO (\s -> (a, s, ""))
> 
> bindMSO :: MSO a -> (a -> MSO b) -> MSO b
> bindMSO m f = MSO (\x -> 
>              let (a, y, s1) = unMSO m x in
>              let (b, z, s2) = unMSO (f a) y in
>              (b, z, s1 ++ s2))

and now MSO can no longer be confused with other functions and you can
declare your Monad instance:

> instance Monad MSO where
>	return = mkMSO
>	(>>=) = bindMSO

> -- To be tested with:
> -- evalMSO (Add (Con 6) (Add (Con 16) (Add (Con 20) (Con 12)))) 0

Now this won't work, since evalMSO produces an MSO, not a function.  You
have to unwrap it to use the function:

> unMSO (evalMSO (Add (Con 6) (Add (Con 16) (Add (Con 20) (Con 12))))) 0


Udo.
-- 
From the MFC source: 
// according to the Win98 docs, this should be 1 
// according to the WinNT docs, this should be 2 
// they are both wrong! 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org//pipermail/haskell-cafe/attachments/20060826/951a5d7e/attachment.bin


More information about the Haskell-Cafe mailing list