Haskell/GHC:不安全地解构构造函数?

Mic*_*eld 6 performance haskell

这是我真正问的一般问题的具体情况:假设我处于性能关键的代码部分并且我收到了一个值

x :: Maybe Int
Run Code Online (Sandbox Code Playgroud)

我知道这是一个Just Int而不是一个Nothing,但由于我的控制代码,我不能安排Int直接接收实际.我想要做

case x of
    Just i -> whatever i
Run Code Online (Sandbox Code Playgroud)

但我不希望GHC插入任何检查或错误处理或跳转或任何东西; 只是将这些位解释为它们的形式Just i并让我处理后果.

这可能吗?(是的,我知道这是不应该经常做的事情.)

dfe*_*uer 1

有时,您可以通过添加一些模式签名来帮助 GHC 确定 GADT 模式是否完全匹配。我不太确定为什么有时会有所帮助,但确实可以。如果你真的想要不安全,那么方法就是制作一个比你正在使用的 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)
Run Code Online (Sandbox Code Playgroud)

构造函数的参数类型和顺序必须匹配,这一点很重要。显然,这一切都是极其不安全的,而且没有任何保证。可能会发生分段错误。