让我们有两个没有任何方法的类,另一个是子类。
此外,我们假设函数f5
和f6
从{1}}到其他类型。
现在,ghci可以编写这些函数并找到它们的签名(在ScopedTypeVariables的帮助下),请参阅下面的unsafeCoerce
。
这些本质上是具有约束f56, f56b and f56'
的函数。
是否可以编写Hmm
,即无需编写
在约束中引用类f56c
?例如。可以ghci编译这个
在一些语言 - pragma的帮助下?
使用SHmm
时有什么样的危险
班级没有任何方法? (或者当子类unsafeCoerce
时
没有任何方法?)是否有其他方式/推荐的方法
写SHmm
和f5
?
作为最后一个,在下面的代码f6
和f5
中有自己的签名,为什么不能只写f6
? (特别是在f56 = f5 . f6
为空的情况下,这就是在编写SHmm
时很容易认为不需要约束SHmm
的原因。)
f56
答案 0 :(得分:5)
绝对不 unsafeCoerce
的安全使用。基本上,f5
可以通过签名将任意两种类型转换为另一种,只要它们中的每一种都具有某些类的实例。但是知道这并没有告诉你任何关于 类型m
和m1
之间的关系。这可能是安全的唯一方法是,如果只有一个类型带有Hmm
个实例 - 比如Int
- 因为那样它实际上只是
f5 :: (m1 ~ Int, m ~ Int) => m -> m1
又名
f5 :: Int -> Int
f5 = unsafeCoerce
......事实上,这确实有效,尽管显然不是很有用。但是,只要您添加任何其他实例,例如SHmm String
,就会在Int
和String
之间获得完整的虚假“转换功能”。
类Hmm
和SHmm
是否有任何方法在这里是无关紧要的,除非它的方法只有Void
同形的类型才能实现(在这种情况下所有这些函数都是安全的) ,但也完全荒谬)。
因此,由于f5
和f6
不起作用,我不知道如何回答其余部分。即使在概念层面上,我也看不出这有什么意义。