这是我真正问的一个一般问题的特定情况:假设我处于代码的性能关键部分,并且已经收到了一个值(value)
x :: Maybe Int
我知道这是一个
Just Int
而不是Nothing
,但是由于代码超出我的控制范围,我无法安排直接接收实际的Int
。我想要做case x of
Just i -> whatever i
但我不希望GHC插入任何检查或错误处理或跳转或任何内容;只是将这些位解释为
Just i
的形式,然后让我处理后果。这可能吗? (是的,我知道这是我们不应该经常做的事情。)
最佳答案
有时,您可以通过添加一些模式签名来帮助GHC找出GADT模式匹配是完全的。我不太确定为什么有时会有所帮助,但确实可以。如果您确实想要不安全的方法,则可以采用一种方法,使GADT比您正在使用的方法更丰富,并且可以不安全地强制使用它。像这样的东西:
data Shmaybe :: Bool -> * -> * where
Noway :: Shmaybe r a
Shucks :: a -> Shmaybe True a
fromShucks :: ShMaybe True a -> a
fromShucks (Shucks a) = a
unsafeFromJust :: forall a . Maybe a -> a
unsafeFromJust m = fromShucks (unsafeCoerce m :: Shmaybe True a)
构造函数必须在参数类型和顺序上匹配,这一点很重要。显然,这绝对是不安全的,并且没有任何保证。分割错误可能会发生。