如何摆脱可能多余的功能约束?

时间:2017-12-15 15:56:53

标签: haskell

让我们有两个没有任何方法的类,另一个是子类。 此外,我们假设函数f5f6从{1}}到其他类型。

现在,ghci可以编写这些函数并找到它们的签名(在ScopedTypeVariables的帮助下),请参阅下面的unsafeCoerce。 这些本质上是具有约束f56, f56b and f56'的函数。

  1. 是否可以编写Hmm,即无需编写 在约束中引用类f56c?例如。可以ghci编译这个 在一些语言 - pragma的帮助下?

  2. 使用SHmm时有什么样的危险 班级没有任何方法? (或者当子类unsafeCoerce时 没有任何方法?)是否有其他方式/推荐的方法 写SHmmf5

  3. 作为最后一个,在下面的代码f6f5中有自己的签名,为什么不能只写f6? (特别是在f56 = f5 . f6为空的情况下,这就是在编写SHmm时很容易认为不需要约束SHmm的原因。)

    f56

1 个答案:

答案 0 :(得分:5)

绝对不 unsafeCoerce的安全使用。基本上,f5可以通过签名将任意两种类型转换为另一种,只要它们中的每一种都具有某些类的实例。但是知道这并没有告诉你任何关于 类型mm1之间的关系。这可能是安全的唯一方法是,如果只有一个类型带有Hmm个实例 - 比如Int - 因为那样它实际上只是

f5 :: (m1 ~ Int, m ~ Int) => m -> m1

又名

f5 :: Int -> Int
f5 = unsafeCoerce

......事实上,这确实有效,尽管显然不是很有用。但是,只要您添加任何其他实例,例如SHmm String,就会在IntString之间获得完整的虚假“转换功能”。

HmmSHmm是否有任何方法在这里是无关紧要的,除非它的方法只有Void同形的类型才能实现(在这种情况下所有这些函数都是安全的) ,但也完全荒谬)。

因此,由于f5f6不起作用,我不知道如何回答其余部分。即使在概念层面上,我也看不出这有什么意义。