为什么coerce
没有默认的身份(identity)限制呢?
import Data.Coerce
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
newtype Id a = Id a
a :: Id Int
a = coerce 3 -- bad
-- • Couldn't match representation of type ‘a0’ with that of ‘Int’ arising from a use of ‘coerce’
-- • Ambiguous type variable ‘a0’ arising from the literal ‘3’
-- prevents the constraint ‘(Num a0)’ from being solved.
-- Probable fix: use a type annotation to specify what ‘a0’ should be.
-- These potential instances exist:
-- instance Num Integer -- Defined in ‘GHC.Num’
-- instance Num Double -- Defined in ‘GHC.Float’
-- instance Num Float -- Defined in ‘GHC.Float’
b :: Id Int
b = coerce (3 :: Int)
我想到可以尝试使用
a0 ~ Int
(或其他一般的约束条件)来解决这个问题,因为身份(和合并约束条件)似乎始终是一个选项。
Coercible
约束,不像其他约束。我们已经有了“特殊”的类(数字默认值),我们还需要更多吗?如果程序员打算使用coerce(3 :: T)
但忘记了::T
怎么办?如果我们有Coercible a X,Coercible b Y,Coercible a b
,其中X
可强制转换为Y
;我们得到a~b~X
还是a~b~Y
?也许在这种情况下,魔法不应该触发,并且仍应生成模糊错误。我并不强烈反对魔法,但我确实害怕不可预测的魔法。 - chiInt
和Integer
之间的区别)。我可以想象,“失败重试”解决方案可能会触发一些意想不到的循环(?)。话虽如此,可强制转换在受信任的代码库中。问题可以被框架化(我认为)超越了Coercible
:如果我们将这些类型类(和类型..)视为一个逻辑系统,那么实际上是通过某些其他关系对某些关系进行商集。 - nicolasTypeable
会生成很多这样的约束条件。 - nicolas