什么类型a - > b布尔在Haskell意味着什么?

时间:2016-12-02 15:38:40

标签: haskell

我知道那种类型:

a -> Bool

是一个函数,它接受类型为a的输入并输出一个布尔值。

键入什么:

a -> b Bool

意思?

3 个答案:

答案 0 :(得分:7)

b Bool中,b代表一个带有一个类型参数的参数化类型(在Haskell的说法中,b是类* -> *的类型构造函数,例如MaybeIO[]

因此,a -> b Bool类型的函数可以采用Int并生成Maybe BoolIO Bool[Bool]等。

答案 1 :(得分:4)

在这种情况下,b是更高级的类型,即从类型到类型的函数。听起来很吓人?不要害怕!较高的kinded类型类似于列表类型。它自己的([])不是一个类型,但它仍然需要一个参数成为一个,所以([]) Int = [Int]是一个类型。

种类与类型类型类似,完全应用类型的类型为*。另一方面,列表的类型是* -> *。因此,它需要*类型(例如Int)并返回一个类型(例如[Int])。其他示例包括MaybeIO或类型为(->)的函数类型* -> * -> *,因为它仍然需要类型,参数类型和结果类型(例如{{ 1}})。

您提供的函数实际上无法实现,就像(->) Int Bool = Int -> Bool类型的函数一样。但是我们可以实现的功能如下:

a -> b

答案 2 :(得分:3)

如果用明确的量化和种类注释写出来,可能会更清楚。 a -> b Bool表示......

forall (a :: *) (b :: * -> *). a -> b Bool
因此,

b是一个类型的构造函数,它采用单一类型的参数。单参数类型构造函数的示例比比皆是:Maybe[]IO都是您可以用来实例化b的事例。

函数f :: a -> b Bool接受任何类型a的参数;它的返回值是您选择的类型构造函数,其参数填入Bool

Parametricity告诉我们,没有任何(非⊥)条款具有这种类型。