【问题标题】:Haskell function that converts type to string by type applicationHaskell 函数,按类型应用程序将类型转换为字符串
【发布时间】:2018-10-22 21:53:24
【问题描述】:

所以,我想要一个这样的函数/值:

converter :: Converter a

其中Converter 将是某个类型族,它总是导致String 并且仅用于我们可以通过使用类型应用程序来应用我们想要转换为String 的类型,例如

converter @Int => "Int"

我正在考虑使用具有typeOf 功能的Typeable 类。不幸的是,它需要一个实际值才能工作。

我可以使用Proxy 来提供“实际”值,但我必须从生成的String 中删除Proxy,这感觉有点脏且容易出错。

想法?

【问题讨论】:

    标签: string haskell types converter


    【解决方案1】:

    我们可以利用一堆扩展:AllowAmbiguousTypes, TypeApplications, ScopedTypeVariables,并生成@Cubic 答案的变体。

    > :{
    | convert :: forall a . Typeable a => String
    | convert = show . typeRep $ Proxy @ a
    | :}
    > convert @ Int
    "Int"
    > convert @ String
    "[Char]"
    > convert @ Float
    "Float"
    

    【讨论】:

    • 你知道一个技巧,我们可以通过它以字符串的形式获取类型同义词(没有模板 haskell)?
    • @Reygoch 我不确定,抱歉。
    • @Reygoch 类型同义词由编译器简化为它们的定义; TH 是唯一希望在运行时得到它们的名字。
    【解决方案2】:

    为什么不直接

    {-# LANGUAGE TypeApplications #-}
    
    import Data.Typeable
    
    main = print $ typeRep (Proxy @Int)
    

    typeRep 旨在采用代理,并且只关心该代理上的类型(因此无需删除任何内容)。当然,其中的附加 Proxy 与您要查找的语法不太一样,但它几乎是一样的,对吧?

    【讨论】:

    • 我错过了typeRep function :D,但我仍然想要类型签名为 `converter :: Typeable => Convert a' 的东西,我可以用简单类型的应用程序调用它。
    • @Reygoch 我有 50% 的把握这对于 haskells 类型系统是不可能的。
    • @Reygoch 如果不是这样,那么一开始就不需要像Proxy 这样的东西。
    • @Cubic Proxies 现在可以替换为模糊类型和显式类型应用程序。几乎没有理由使用它们 (IMO),除非在处理新替代方案之前的旧库时。​​
    • @chi 我遇到的唯一用途是:data Some con = forall a. con a => Some (Proxy a)。如果没有Proxy,我认为模式匹配无法将Some 中的“包含”类型绑定到名称:case _ :: Some Show of Some (Proxy :: Proxy introduced) -> _
    猜你喜欢
    • 2011-12-31
    • 2013-03-16
    • 1970-01-01
    • 2020-11-22
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多