【发布时间】:2014-03-14 13:55:16
【问题描述】:
我想在 haskell 中实现 am Abstract Datype。 给定一个具有定义类型的 moule,比如说 Mytype:
module A (myType,MyType) where
type MyType = Float
mytype :: Float -> MyType
myType f = f
作为单个浮点数在内部实现,我只导出了一个函数来构造一个给定浮点数的值和类型本身。 问题是,当我加载该模块时,我可以访问实现。
给定:
module B where
import A
data OtherType = One MyType
| Two MyType MyType
deriving Show
我可以像这样构造一个 OtherType 类型的对象:
One $ mytype 1.0
或者像这样:
One $ (1.0 :: Float)
如果是真正的抽象,我不应该这样做!
如何导出 Mytype 类型,以便我只能从构造函数构造值
【问题讨论】:
-
type不会创建任何新内容。它只是为已经存在的类型创建一个方便的名称。编译代码后,您的类型同义词就消失了,mytype将具有类型Float -> Float -
type的行为等同于 C 语言中的typedef,如果您熟悉的话。您正在寻找data或newtype。
标签: haskell abstraction abstract-data-type