这是我真正问的一个一般问题的特定情况:假设我处于代码的性能关键部分,并且已经收到了一个值(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)

构造函数必须在参数类型和顺序上匹配,这一点很重要。显然,这绝对是不安全的,并且没有任何保证。分割错误可能会发生。

10-01 20:02