Haskell按类型应用将类型转换为字符串的函数
Haskell function that converts type to string by type application
所以,我想要一个像这样的函数/值:
converter :: Converter a
其中 Converter
是某种总是导致 String
的类型族,使用它只是为了我们可以通过使用 type 应用我们想要转换为 String
的类型应用例如
converter @Int => "Int"
我正在考虑使用具有 typeOf
功能的 Typeable
class。不幸的是,这需要一个实际值才能工作。
我可以使用 Proxy
来提供 "actual" 值,但是我必须从结果 String
中删除 Proxy
并且感觉有点脏而且容易出错。
想法?
为什么不只是
{-# LANGUAGE TypeApplications #-}
import Data.Typeable
main = print $ typeRep (Proxy @Int)
typeRep
旨在采用代理,并且只会关注该代理上的类型(因此无需删除任何内容)。当然,其中的附加 Proxy
不是您正在寻找的语法,但它几乎是一回事,对吗?
我们可以利用一堆扩展:AllowAmbiguousTypes, TypeApplications, ScopedTypeVariables
,并生成@Cubic 答案的变体。
> :{
| convert :: forall a . Typeable a => String
| convert = show . typeRep $ Proxy @ a
| :}
> convert @ Int
"Int"
> convert @ String
"[Char]"
> convert @ Float
"Float"
所以,我想要一个像这样的函数/值:
converter :: Converter a
其中 Converter
是某种总是导致 String
的类型族,使用它只是为了我们可以通过使用 type 应用我们想要转换为 String
的类型应用例如
converter @Int => "Int"
我正在考虑使用具有 typeOf
功能的 Typeable
class。不幸的是,这需要一个实际值才能工作。
我可以使用 Proxy
来提供 "actual" 值,但是我必须从结果 String
中删除 Proxy
并且感觉有点脏而且容易出错。
想法?
为什么不只是
{-# LANGUAGE TypeApplications #-}
import Data.Typeable
main = print $ typeRep (Proxy @Int)
typeRep
旨在采用代理,并且只会关注该代理上的类型(因此无需删除任何内容)。当然,其中的附加 Proxy
不是您正在寻找的语法,但它几乎是一回事,对吗?
我们可以利用一堆扩展:AllowAmbiguousTypes, TypeApplications, ScopedTypeVariables
,并生成@Cubic 答案的变体。
> :{
| convert :: forall a . Typeable a => String
| convert = show . typeRep $ Proxy @ a
| :}
> convert @ Int
"Int"
> convert @ String
"[Char]"
> convert @ Float
"Float"