是否可以为(->) a b
编写一个通用的Show实例,其中包含a
b
在(->)
饱和时的类型? E.g。
*Main> :set -XFlexibleInstances
*Main> instance Show ((->) Int Int) where show f = "Int -> Int"
*Main> f = id :: Int -> Int
*Main> f
-- output: Int -> Int
对每种可能的组合进行编码需要做很多工作。还有更好的方法吗?
答案 0 :(得分:4)
是的,如果a
和b
是Typeable
个实例。
import Data.Typeable
import Data.Proxy
instance (Typeable a, Typeable b) => Show (a -> b) where
show f = show (typeRep $ a f) ++ " -> " ++ show (typeRep $ b f)
where a :: (a' -> b') -> Proxy a'
a _ = Proxy
b :: (a' -> b') -> Proxy b'
b _ = Proxy
使用-XScopedTypeVariables
,这会变得更简单。
import Data.Typeable
import Data.Proxy
instance forall a b. (Typeable a, Typeable b) => Show (a -> b) where
show f = show (typeRep $ a) ++ " -> " ++ show (typeRep $ b)
where a :: Proxy a
a = Proxy
b :: Proxy b
b = Proxy
或者,正如Alec在评论中指出的那样,你可以用这种更简单的方式做到这一点。
import Data.Typeable
import Data.Proxy
instance (Typeable a, Typeable b) => Show (a -> b) where
show = show . typeOf