所以,我想要一个像这样的函数/值:
converter :: Converter a
其中Converter
将是某个类型系列,它始终会生成String
并且仅用于我们可以通过使用类型应用程序将我们要转换为String
的类型应用于
converter @Int => "Int"
我在考虑使用具有Typeable
功能的typeOf
类。不幸的是,它需要一个实际的价值才能发挥作用。
我可以使用Proxy
来提供“实际”值,但我必须从生成的Proxy
中删除String
,这样会感觉有点脏,容易出错。< / p>
思想?
答案 0 :(得分:3)
为什么不
{-# LANGUAGE TypeApplications #-}
import Data.Typeable
main = print $ typeRep (Proxy @Int)
typeRep
旨在获取代理,并且只关注该代理上的类型(因此不需要删除任何内容)。当然,那里的额外Proxy
并不是你要寻找的语法,但它几乎是一样的吗?
答案 1 :(得分:3)
我们可以利用一堆扩展:AllowAmbiguousTypes, TypeApplications, ScopedTypeVariables
,并生成@ Cubic答案的变体。
> :{
| convert :: forall a . Typeable a => String
| convert = show . typeRep $ Proxy @ a
| :}
> convert @ Int
"Int"
> convert @ String
"[Char]"
> convert @ Float
"Float"