只是发现了一个新的数据类型,但我绝对不明白它的实际含义。
data Gate = Gate (Bool->Bool->Bool)
输出
let a = Gate
a :: (Bool->Bool->Bool)->Gate
首先,我认为它说我需要两个布尔来获得一个新的布尔,但是:t a表示我需要三个布尔,不是吗?
答案 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