Old code broken by new Typeable class

adam vogt vogt.adam at gmail.com
Tue Aug 5 17:04:56 UTC 2014


Hi Volker,

You can use this extension:
http://www.haskell.org/ghc/docs/latest/html/users_guide/deriving.html#stand-alone-deriving
to write that orphan Typeable instance for most ghcs (probably 6.10 is
the earliest).

It might be worth pushing for a Typeable instance to be added to the
unix package (here:
http://hackage.haskell.org/package/unix-2.7.0.1/docs/System-Posix-Process.html#t:ProcessStatus,
with Carter's code): somebody else might define the same orphan
instance too, which will break programs that end up seeing both
instances.

Regards,
Adam

On Tue, Aug 5, 2014 at 12:49 PM, Carter Schonwald
<carter.schonwald at gmail.com> wrote:
> more concretely
> #if defined(__GLASGOW_HASKELL__) && ( __GLASGOW_HASKELL__ >= 707)
>  --- do the deriving version here
> #else
> --- your current stuff
> #endif
>
>
> On Tue, Aug 5, 2014 at 12:46 PM, Carter Schonwald
> <carter.schonwald at gmail.com> wrote:
>>
>> i assume 7.6 and 7.8, if we're talking GHC rather than GCC :)
>>
>> in 7.8 you can't define userland typeable instances, you need only write
>> deriving (Typeable) and you're all set.
>> add some CPP to select the instances suitable
>>
>>
>> On Tue, Aug 5, 2014 at 12:41 PM, Volker Wysk <verteiler at volker-wysk.de>
>> wrote:
>>>
>>> Hi!
>>>
>>> I've been working with GHC-4.6.3, and updating to GHC-4.8.3 breaks my
>>> code,
>>>
>>> because the Typeable class has been changed. The compiler produces this
>>>
>>> message:
>>>
>>> ---------
>>>
>>> src/HsShellScript/ProcErr.chs:2294:4:
>>>
>>>     ‘typeOf’ is not a (visible) method of class ‘Typeable’
>>>
>>> ---------
>>>
>>> I want to define System.Posix.Process.ProcessStatus to be an instance of
>>>
>>> Typeable, so I can throw and catch it as an exception. ProcessStatus
>>> isn't
>>>
>>> typeable by default.
>>>
>>> Is it still possible to make ProcessStatus a member of Typeable? How?
>>>
>>> Obviously, you can't accomplish it by deriving Typeable, because the
>>> definition
>>>
>>> can't be changed any longer.
>>>
>>> This is the spot in question:
>>>
>>> ----------
>>>
>>> import System.Posix.Process
>>>
>>> import Data.Typeable
>>>
>>> {-
>>>
>>> data ProcessStatus = Exited ExitCode
>>>
>>>                    | Terminated Signal
>>>
>>>                    | Stopped Signal
>>>
>>>                    deriving (Eq, Ord, Show)
>>>
>>> -}
>>>
>>> instance Typeable ProcessStatus where
>>>
>>>    typeOf = const tyCon_ProcessStatus
>>>
>>> tyCon_ProcessStatus = mkTyConApp (mkTyCon3 "hsshellscript"
>>>
>>>                                            "HsShellScript.ProcErr"
>>>
>>>                                            "Posix.ProcessStatus") []
>>>
>>> instance Exception ProcessStatus
>>>
>>> ----------
>>>
>>> Thanks,
>>>
>>> V.W.
>>>
>>>
>>> _______________________________________________
>>> Glasgow-haskell-users mailing list
>>> Glasgow-haskell-users at haskell.org
>>> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>>>
>>
>
>
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>


More information about the Glasgow-haskell-users mailing list