[Haskell-cafe] "Casting" newtype to base type?

Malcolm Wallace malcolm.wallace at me.com
Mon Jul 1 17:24:00 CEST 2013


On 1 Jul 2013, at 16:07, Vlatko Basic wrote:

> I had a (simplified) record
> 
>  data P = P {
>    a :: String,
>    b :: String,
>    c :: IO String
>    } deriving (Show, Eq)
> 
> but to get automatic deriving of 'Show' and 'Eq' for 'data P' I have created 'newtype IOS' and its 'Show' and 'Eq' instances
> 
>  newtype IOS = IO String

Not quite!  That is a newtype'd String, not a newtype's (IO String).  Try this:

    newtype IOS = IOS (IO String)

> but now when I try to set 'c' field in
> 
>    return $ p {c = readFile path}
> 
> I get error
>  Couldn't match expected type `IOS' with actual type `IO String'

Use the newtype constructor to convert an IO String -> IOS.

    return $ p {c = IOS $ readFile path}

Regards,
    Malcolm


More information about the Haskell-Cafe mailing list