how to write a derivable class?

前端 未结 2 1241
太阳男子
太阳男子 2020-12-31 08:24

i have this

data Something = Something Integer deriving (MyClass, Show)

class MyClass a where   
    hello :: MyClass a => a -> a

instance MyClass In         


        
2条回答
  •  礼貌的吻别
    2020-12-31 09:04

    GHC cannot magically derive instances for arbitrary data types. However, it can make use of the fact that newtype declarations create a new name for the same underlying type to derive instances for those using the GeneralizedNewtypeDeriving extension. So, you could do something like this:

    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    
    newtype Something = Something Integer deriving (MyClass, Show)
    
    class MyClass a where
        hello :: MyClass a => a -> a
    
    instance MyClass Integer where
        hello i = i + 1
    
    main = print . hello $ Something 3
    

    The reason GHC cannot derive the new instance is that it does not know what the instance should be. Even if your data type only has one field, it may not necessarily be the same as that field. The ability to derive instances for newtypes is convenient, since they are usually used to provide different behaviours for certain typeclasses or as a way to use the type system to separate things that have the same type but different uses in your code.

提交回复
热议问题