对于使用 Data.Typeable 的所有函数,有一个部分解决方案超出了固定字符串的范围。
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Typeable
instance (Typeable a, Typeable b) => Show (a->b) where
show _ = show $ typeOf (undefined :: a -> b)
在 ghci
> let test :: Int->Int; test x = x + x
> test
Int -> Int
不幸的是,如果没有类型签名,类型将默认使用。
> let test x = x + x
> test
Integer -> Integer
该解决方案适用于多种功能,因为a -> b -> c
它与a -> (b -> c)
您可能编写的相同a -> d
where d = b -> c
。
> let m10 a b c d e f g h i j = a * b * c * d * e * f * g * h* i * j
> m10
Integer -> Integer -> Integer -> Integer -> Integer -> Integer -> Integer
-> Integer -> Integer -> Integer -> Integer
但是,当不知道函数的参数是否具有可类型类时,此方法不起作用,但是 while map (+1)
will workmap
将不起作用。
> map (+1)
[Integer] -> [Integer]
> map
<interactive>:233:1:
...
在浏览了Data.Data
一个或两个实验的内部之后,似乎可以将其重构为更通用一点,涵盖更多功能。