为( - >)编写Show实例

时间:2018-03-18 19:09:07

标签: haskell

是否可以为(->) 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

对每种可能的组合进行编码需要做很多工作。还有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

是的,如果abTypeable个实例。

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