我想在haskell中实现am Abstract Datype。 给定具有已定义类型的moule,请说Mytype:
module A (myType,MyType) where
type MyType = Float
mytype :: Float -> MyType
myType f = f
在内部实现为单个Float,我只导出一个函数来构造给定Float的值,以及类型本身。 问题是,当我加载该模块时,我可以访问实现。
假设:
module B where
import A
data OtherType = One MyType
| Two MyType MyType
deriving Show
我可以构造一个类型为OtherType的对象:
One $ mytype 1.0
或者像这样:
One $ (1.0 :: Float)
有了真正的抽象,我不应该这样做!
如何以某种方式导出Mytype类型,我只能从构造函数构造值
答案 0 :(得分:2)
您可以改为创建代数数据类型:
module A (myType,MyType) where
data MyType = MyType Float
mytype :: Float -> MyType
myType f = MyType f
然后,尝试评估像
这样的事情One (MyType 3.0)
抛出“不在范围内:数据构造函数`MyType'”