新数据类型,但这是什么意思?

时间:2018-08-10 17:42:43

标签: haskell

只是发现了一个新的数据类型,但我绝对不明白它的实际含义。

data Gate = Gate (Bool->Bool->Bool)

输出

let a = Gate
a :: (Bool->Bool->Bool)->Gate

首先,我认为它说我需要两个布尔来获得一个新的布尔,但是:t a表示我需要三个布尔,不是吗?

2 个答案:

答案 0 :(得分:4)

data Gate = Gate (Bool->Bool->Bool)定义了类型Gate和该类型的构造函数,也称为Gate

执行let a = Gate时,Haskell假设您的意思是Gate构造函数,因为let允许您将其绑定为值。

Gate构造函数的类型是将采用Bool->Bool->Bool类型的值并返回 type Gate值的函数的类型。 / p>

您可以执行类似data Gate = MakeGate (Bool -> Bool -> Bool)的操作来突出显示差异

答案 1 :(得分:4)

Gate有两件事:一个类型,以及一个创建该类型的值的构造函数。该类型的用途是包装类型Bool -> Bool -> Bool的函数。例如:

> data Gate = Gate (Bool->Bool->Bool)
> andGate = Gate (&&)
> orGate = Gate (||)

Gate数据构造函数不采用Bool值;它只需要一个Bool -> Bool -> Bool类型的 function 并将其“提升”为Gate类型。

要使用此功能任何事情,您需要某种方法从其包装中提取功能。

> getFunc (Gate f) = f
> (getFunc andGate) True False
False

通常,出于性能原因,您可以使用newtype而不是data来定义这样的类型:

newtype Gate = Gate (Bool -> Bool -> Bool)

实际上,类型是相同的,但是newtype效率更高,因为在内部会为您剥离包装器。无论哪种情况,只有在想为Gate创建一些特定的typeclass实例时,才定义一个新类型。否则,您可以定义一个类型别名,例如

type Gate = Bool -> Bool -> Bool