Hello Cafe!

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
  instance Show (IOS) where show _ = "(IO String) function"
  instance Eq   (IOS) where _ == _ = True

(the easiest 'instance Show (IO String) where ...' produces "orphan instance")

and changed 'data P' to

  data P = P {
    a :: String,
    b :: String,
    c :: IOS
    } deriving (Show, Eq)

but now when I try to set 'c' field in

  fun :: FilePath -> P -> IO P
  fun path p = do
    b <- doesFileExist path
    ...
    return $ p {c = readFile path}

I get error
  Couldn't match expected type `IOS' with actual type `IO String'

which is correct.

So, the question is:

  Is it possible to somehow "cast" 'IO String' to 'IOS',
  or in some other way set 'c' field to an 'IO String' function
  so that it can be later used such as 'content <- c p'.



Thanks

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to