String Haskell函数,用于按应用程序类型将类型转换为字符串
我想要一个这样的函数/值:String Haskell函数,用于按应用程序类型将类型转换为字符串,string,haskell,types,converter,String,Haskell,Types,Converter,我想要一个这样的函数/值: converter :: Converter a 其中,Converter将是某种类型族,它总是产生String,使用它只是为了我们可以通过使用类型应用程序来应用我们想要转换为String的类型,例如 converter @Int => "Int" 我正在考虑使用Typeable类,它具有typeOf函数。不幸的是,它需要一个实际值才能工作 我可以使用Proxy来提供“实际”值,但是我必须从生成的字符串中删除Proxy,这感觉有点脏而且容易出错 想法?为什么
converter :: Converter a
其中,Converter
将是某种类型族,它总是产生String
,使用它只是为了我们可以通过使用类型应用程序来应用我们想要转换为String
的类型,例如
converter @Int => "Int"
我正在考虑使用Typeable
类,它具有typeOf
函数。不幸的是,它需要一个实际值才能工作
我可以使用Proxy
来提供“实际”值,但是我必须从生成的字符串中删除Proxy
,这感觉有点脏而且容易出错
想法?为什么不
{-# LANGUAGE TypeApplications #-}
import Data.Typeable
main = print $ typeRep (Proxy @Int)
typeRep
被设计为接受代理,并且只关注该代理上的类型(因此无需删除任何内容)。当然,其中附加的代理
不是您想要的语法,但基本上是一样的,对吗?为什么不
{-# LANGUAGE TypeApplications #-}
import Data.Typeable
main = print $ typeRep (Proxy @Int)
typeRep
被设计为接受代理,并且只关注该代理上的类型(因此无需删除任何内容)。当然,其中附加的代理
的语法与您想要的不太一样,但基本上是一样的,对吗?我们可以利用一系列扩展:AllowAmbiguousTypes、TypeApplications、ScopedTypeVariables
,并生成@Cubic答案的变体
> :{
| convert :: forall a . Typeable a => String
| convert = show . typeRep $ Proxy @ a
| :}
> convert @ Int
"Int"
> convert @ String
"[Char]"
> convert @ Float
"Float"
我们可以利用一系列扩展:AllowAmbiguousTypes、TypeApplications、ScopedTypeVariables
,并生成@Cubic答案的变体
> :{
| convert :: forall a . Typeable a => String
| convert = show . typeRep $ Proxy @ a
| :}
> convert @ Int
"Int"
> convert @ String
"[Char]"
> convert @ Float
"Float"
我错过了typeRep
function:D,但我仍然想要一个类型签名为“converter::Typeable=>Convert a”的东西,我可以用简单的类型应用程序调用它。@Reygoch我有50%的把握这在Haskell的类型系统中是不可能的。@Reygoch如果不是,一开始就不需要像Proxy
这样的东西。@Cubic代理现在可以被不明确的类型和显式类型应用程序替换。几乎没有理由使用它们(IMO),除非是在处理新替代方案之前的旧库时。@chi我唯一遇到的用法是:data Some con=forall a。con a=>Some(Proxy a)
。如果没有代理
,我认为模式匹配无法将Some
中的类型“包含”绑定到一个名称:case\uu::Some Show of Some(Proxy::Proxy improducted)->
我错过了typeRep
函数:D,但我仍然想要一些类型签名为“converter::Typeable=>Convert a”的东西,我可以用简单的类型应用程序调用它。@Reygoch我有50%的把握这在haskells类型系统中是不可能的。@Reygoch如果不是,一开始就不需要像Proxy
这样的东西。@Cubic代理现在可以被不明确的类型和显式类型应用程序替换。几乎没有理由使用它们(IMO),除非是在处理新替代方案之前的旧库时。@chi我唯一遇到的用法是:data Some con=forall a。con a=>Some(Proxy a)
。如果没有代理
,我认为模式匹配无法将Some
中的类型“包含”绑定到一个名称:case.\uquot:Some Show of Some(Proxy::Proxy引入)->\uquot/code>你可能知道一个技巧,通过它我们可以得到字符串形式的类型同义词(没有模板haskell)?@Reygoch我不确定,抱歉。@Reygoch类型的同义词被编译器简化为它们的定义;这是在运行时获取它们名称的唯一希望。您可能知道一个技巧,通过它我们可以以字符串的形式获取类型同义词(没有模板haskell)?@Reygoch我不确定,抱歉。@Reygoch类型同义词被编译器简化为它们的定义;这是在运行时获取它们名称的唯一希望。