繁体   English   中英

Haskell不安全将新类型强制转换为相同的新类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM