[英]Haskell unsafeCoerce newtype to identical newtype
想象有一个新类型声明:
newtype T = T Int
此声明在模块中,但未导出。 我想将T类型的值传递给函数。 现在,我可以使用完全相同的定义声明自己的T版本。 如果我将(my.T 0)
传递给期望(hidden.T 0)
的函数,编译器当然会抱怨。 我将使用unsafeCoerce将前者强制为后者。 这里提到,使用“在新类型和它包装的类型之间”是安全的。 我只想检查一下我描述的情况是否也安全。
我知道这与良好软件规范,类型理论,功能编程哲学,ghc策略,常识等所有原则背道而驰。 但是,我想知道这是否“正常”起作用。
在当前的GHC实施中,这可能是安全的,但这不是解决特定问题的推荐方法。
通常使用的模式是具有一个内部模块,如下所示:
module Foo.Types (T(..)) where
newtype T = T Int
在您的Cabal文件中,此模块声明为未导出。 然后,在要使用Types
模块中,导入Types
模块,并直接使用构造函数:
module Foo.Bla where
import Foo.Types (T(..))
f :: T -> Bla
f (T int) = makeBla int
最后,您可以根据需要导出不透明类型。 例如:
module Foo (T) where
import Foo.Types (T(..))
makeT :: Int -> T
makeT = T
可以改用强制,但是依靠它是一个坏主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.