haskell - 幽灵类型困惑?

标签 haskell phantom-types

我对幻像类型的使用感到困惑:

type Words = String
type Numbers = Int

data NonPhantom = NP1 Words | NP2 Numbers deriving (Show)

data Phantom a = P1 Words | P2 Numbers deriving (Show) 

nonPhantomFunction :: NonPhantom -> Int
nonPhantomFunction r = 100


phantomFunction :: Phantom Numbers -> Int
phantomFunction a = 2001


main = do
   print $ nonPhantomFunction (NP1 "sdsdds") --can also pass NP2 here! 
   print $ phantomFunction (P1 "sdsdsd") --This shouldn't work!?

我希望这段代码NOT能够编译,因为phantomFunction明确声明了它期望的Phantom数据类型Numbers.

但是这样编译好吗?我做错了什么?

最佳答案

data Phantom a = P1 Words | P2 Numbers deriving (Show) 

这使得 P1 "aa"Phantom a 形式的任何类型,对于任何 a,包括 Numbers.

关于haskell - 幽灵类型困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39931404/

相关文章:

haskell - 从幻像类型创建(获取)值实例

rust - PhantomData 在 Rust 中究竟是如何工作的?

haskell - 现代 GHC 版本是否有任何类型的证明删除?

haskell - 定义幻像类型 - 无法编译示例

haskell - 简单函数中的类型混淆

haskell - 我应该如何表示带有附加信息注释的 AST?

xml - 一次添加一个元素的箭头

haskell - 为什么 Haskell 在声明类实例时不允许使用类型同义词?

scala - 未强制执行方法的类型边界

haskell - 如何删除reactive-banana中的重复事件