【问题标题】:what would a "modern" TypeCast look like?“现代” TypeCast 会是什么样子?
【发布时间】:2013-10-29 15:28:19
【问题描述】:

TypeCast 类可以追溯到 2004 年,因此是相当“旧”的 Haskell(即使仍然非常出色)。我的问题是:如果今天在最先进的 GHC 中重新实现[最好是 7.6,但继续,如果这能让事情变得更好,请使用 HEAD],它会是什么样子?

如果我了解一些最近的扩展,那么正确的答案很可能是:甚至不再需要它,只需使用 X。知道 X 的值会很好;)

【问题讨论】:

  • 您能否提供一个您认为有用的简单示例?
  • 你的意思是this class
  • 我对@9​​87654325@不太熟悉; Dynamic 是否属于同一个细分市场?
  • 是的,@leftaroundabout 我的意思就是那个类。
  • 不,@DanielWagner,Dynamic 不在同一个领域。

标签: haskell


【解决方案1】:

我不熟悉TypeCast 的所有用法,但在我最近所做的事情中,您可以将它替换为从TypeFamilies 扩展中获得的类型相等断言(~)。我第一次看到这个是在 Oleg 的 here:

 class  TypeEq x y b | x y -> b
 instance               TypeEq x x HTrue
 instance b ~ HFalse => TypeEq x y b

Oleg 解释了这个巫毒教如何比我更有效:

如果类型检查器可以看到两个类型 t1 和 t2 相同,那么 可以选择第一个 TypeEq 实例,约束 TypeEq t1 t2 b 简化为 b ~ HTrue。否则 TypeEq 的第三个参数 与 HFalse 统一。单词otherwise' betrays the complementation,默认情况下',这是核心 重叠的实例。我们看到了有用性的第一个暗示 重叠实例及其与类型等式的关系。

在下面的sn-p中"advanced overlap" wiki page也提到了这一点:

-- instance TypeCast flag HFalse => ShowPred a flag -- before -XTypeFamilies
instance (flag ~ HFalse) => ShowPred a flag

【讨论】:

  • 虽然很有趣,但您的回答并不是我的问题:TypeCast 有一个方法,它允许人们“转换”一个值。 TypeEq 仅仅见证了类型级别的可转换性。当然,它是相关的,但它只是问题的一部分。
  • 问题是我不明白typeCast方法在什么情况下是有用的或必要的,不关心追捕一个;如果您可以提供一个使用示例,我可以尝试使用~ 定义一个新的TypeCast。我的帖子本身不是关于 TypeEq 的,它只是对可以替代 TypeCast 的技术的演示,您可以在最后一个代码块中并排看到这两种技术。
  • 你可以写f :: (a ~ Int) => a; f = (5 :: Int)。旧方法要求您在值级别重复转换:g :: (TypeCast a Int) => a; g = typeCast (5 :: Int)
猜你喜欢
  • 2020-03-12
  • 2019-02-27
  • 2011-09-09
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多