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"