【问题标题】:Understanding the type of the cast operator in Scrap Your Boilerplate了解 Scrap Your Boilerplate 中的 cast 运算符的类型
【发布时间】:2012-07-07 16:25:10
【问题描述】:

在 Laemmel 和 SPJ 的 2003 Scrap Your Boilerplate paper 中,第 3 页上有一个代码 sn-p

mkT :: (Typeable a, Typeable b) => (b -> b) -> a -> a
mkT f = case cast f of
   Just g -> g
   Nothing -> id

然后论文解释了

也就是说,如果 x 的类型与 f 的参数类型相同,则 mkT f x 将 f 应用于 x

按照本文前面示例的模式,我认为必须将cast f 的类型与Maybe (b -> b) 类型进行比较才能将上述结果评估为Just g,但这似乎不正确。

cast f 的签名是怎么回事?

【问题讨论】:

    标签: haskell scrap-your-boilerplate


    【解决方案1】:

    cast的类型是

    cast :: (Typeable x, Typeable y) => x -> Maybe y
    

    如果xy 是不同的类型,它会产生Nothing,如果它们是相同的,它会产生Just argument。请注意,当使用cast 时,结果类型y 必须从调用上下文中确定。如果不是,则编译失败并出现未解决的重载/模糊类型变量错误。

    在这个特定示例中,类型是函数类型,(b -> b) 用于参数,(a -> a) 用于结果。所以

    cast f :: Maybe (a -> a)
    

    mkT也可以写成mkT = fromMaybe id . cast

    【讨论】:

    • cast 检查fTypeRep 并将其与所需类型的TypeRep 进行比较。如果TypeReps 相同,则返回Just f,否则返回Nothing
    • 我想我现在明白了。我错过了右手类型类约束如何工作的基本概念。我想接受您的回答,但您能否编辑/澄清 w.r.t.在此示例中,cast 如何使用mkT 签名的右侧部分(a -> a)“填充”其右侧类型类约束(因为-> 是右关联的)?
    • 右侧类型必须由调用上下文确定,就像 read(或 fromIntegral,但该类型有默认类型)一样。这说明清楚了吗?
    • 是的,当我仔细观察cast 的上下文并意识到我不知道Typeable y 发生了什么时,我有一个“啊哈”的时刻,然后我发现了一个用read 示例回答learnyouahaskell.com/types-and-typeclasses
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2016-03-29
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多