簡體   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