【问题标题】:Implementing DataType abstraction in Haskell在 Haskell 中实现 DataType 抽象
【发布时间】: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


【解决方案1】:

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

module A (myType,MyType) where

data MyType = MyType Float

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

然后,尝试评估诸如

One (MyType 3.0)

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

【讨论】:

  • 或newtype。关键是不要使用type,因为那不是它的作用。
猜你喜欢
  • 2020-04-12
  • 2022-11-30
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多