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