在Haskell中实现DataType抽象

时间:2014-02-15 01:36:22

标签: haskell abstraction abstract-data-type

我想在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类型,我只能从构造函数构造值

1 个答案:

答案 0 :(得分:2)

您可以改为创建代数数据类型:

module A (myType,MyType) where

data MyType = MyType Float

mytype :: Float -> MyType
myType f = MyType f

然后,尝试评估像

这样的事情
One (MyType 3.0)

抛出“不在范围内:数据构造函数`MyType'”