相关疑难解决方法(0)

这是不安全的Coerce的安全使用吗?

我有一种情况,我现在使用非常可怕的函数unsafeCoerce.幸运的是,这不是重要的事情,但我想知道这是否是这个功能的安全用法,或者是否有其他方法可以解决其他人所知道的这个特殊问题.

我的代码如下:

data Token b = Token !Integer

identical :: Token a -> Token b -> Bool
identical (Token a) (Token b) = a == b

data F a = forall b. F (Token b) (a -> b)

retrieve :: Token b -> F a -> Maybe (a -> b)
retrieve t (F t' f) = if identical t t' then Just (unsafeCoerce f) else Nothing
Run Code Online (Sandbox Code Playgroud)

还有两点需要注意的是,这些令牌是在monad中使用的,我用它来确保为它们提供整数是唯一的(即我不会两次使用相同的令牌).我也使用forall量化的阴影类型变量,与ST monad一样,以确保(假设只使用我在模块中公开的方法)没有办法返回令牌(或者实际上甚至是F)来自monad而不是类型错误.我也没有公开令牌构造函数.

我认为,据我所知,这应该是对safeafeCoerce的安全使用,正如我可以说的那样(我希望)相当高的信心,我所强迫的价值实际上是我强迫它的类型,但我可能错了.我也尝试过使用Data.Typeable,它工作得很好,但目前我正在尝试避免使用Typeable约束,特别是因为gcast似乎在很多方面做了类似的事情,我仍然需要令牌才能区分不同类型的Fs.

非常感谢任何帮助/建议.

haskell types dynamic-typing

13
推荐指数
2
解决办法
1214
查看次数

标签 统计

dynamic-typing ×1

haskell ×1

types ×1