标签: value-constructor

值构造函数和元组之间有什么区别?

据说 Haskell元组只是代数数据类型的不同语法.类似地,有一些示例说明如何使用元组重新定义值构造函数.

例如,Haskell中的Tree数据类型可能被写为

data Tree a = EmptyTree | Node a (Tree a) (Tree a)
Run Code Online (Sandbox Code Playgroud)

可以像这样转换为"元组形式":

data Tree a = EmptyTree | Node (a, Tree a, Tree a)
Run Code Online (Sandbox Code Playgroud)

Node第一个示例中的值构造函数tuple与第二个示例中的值构造函数有什么区别?ie Node a (Tree a) (Tree a)vs. (a, Tree a, Tree a)(除了语法之外)?

在引擎盖下,Node a (Tree a) (Tree a)每个位置的3元组适当类型只是一种不同的语法?

我知道你可以部分应用一个值构造函数,例如Node 5它将具有类型:(Node 5) :: Num a => Tree a -> Tree a -> Tree a

您也可以使用(,,)函数来部分应用元组...但是这不知道未绑定条目的潜在类型,例如:

Prelude> :t (,,) 5
(,,) 5 …
Run Code Online (Sandbox Code Playgroud)

haskell tuples algebraic-data-types value-constructor

12
推荐指数
2
解决办法
785
查看次数

为什么我能够使用我的值构造函数,即使我不导出它?

实际上,我正在一个名为"Queue"的模块中实现队列数据类型.我的数据类型也称为"队列",它是唯一的值构造函数:

module Queue (Queue, enq, emptyQueue) where

data Queue a = Queue {
  inbox  :: [a],
  outbox :: [a]
} deriving (Eq, Show)

emptyQueue :: Queue a
emptyQueue = Queue [] []

enq :: a -> Queue a -> Queue a
enq x (Queue inb out) = Queue (x:inb) out

-- other function definitions (irrelevant here)...
Run Code Online (Sandbox Code Playgroud)

据我所知,因为我写的Queue,不是Queue(..)Queue(Queue)在导出语句中,我不希望模块导出我的数据类型的值构造函数.这正是我想要的,为了封装目的:用户不应该直接使用值构造函数; only emptyQueue,enq和我界面中的其他功能.

然而(并且我的问题的解决方案对于经验丰富的Haskellers来说可能是显而易见的),如果我在GHCi中加载我的模块,我可以直接使用值构造函数.

$ ghci Queue.hs
GHCi, version 7.8.4: http://www.haskell.org/ghc/  :? for help
Loading …
Run Code Online (Sandbox Code Playgroud)

haskell encapsulation module ghci value-constructor

8
推荐指数
1
解决办法
122
查看次数

为什么我不能在不同的数据类型中重用相同的值构造函数?

我是Haskell的新手,可能在这里遗漏了一些非常基本的东西,但是我无法在不同的数据类型中重用相同的值构造函数.

data Colour = Red | Pink | Orange | Yellow
data Fruit  = Apple | Orange | Banana
Run Code Online (Sandbox Code Playgroud)

这会产生错误

Multiple declarations of ‘Orange’

不知道为什么这是不允许的,我在学习Haskell之前一直在使用OCaml,并且能够定义这样的类型

haskell algebraic-data-types value-constructor user-defined-data-types

3
推荐指数
1
解决办法
222
查看次数

为什么在值构造函数中声明的类型不是Haskell中的类型?

假设我有以下值构造函数:

data Shape = Circle Float Float Float | Rectangle Float Float Float Float
Run Code Online (Sandbox Code Playgroud)

现在我可以运行:

ghci> :t Circle
Circle :: Float -> Float -> Float -> Shape
Run Code Online (Sandbox Code Playgroud)

现在我可以写一个类型声明了

surface :: Shape -> Float
Run Code Online (Sandbox Code Playgroud)

但我无法输入类型声明

surface :: Circle -> Float
Run Code Online (Sandbox Code Playgroud)

是因为 " Circle不是一种类型,Shape是"

我的问题是:为什么在值构造函数中声明的类型不是Haskell中的类型?

haskell type-declaration value-constructor

1
推荐指数
1
解决办法
202
查看次数