我知道那种类型:
a -> Bool
是一个函数,它接受类型为a的输入并输出一个布尔值。
键入什么:
a -> b Bool
意思?
答案 0 :(得分:7)
在b Bool
中,b
代表一个带有一个类型参数的参数化类型(在Haskell的说法中,b
是类* -> *
的类型构造函数,例如Maybe
,IO
或[]
。
因此,a -> b Bool
类型的函数可以采用Int
并生成Maybe Bool
,IO Bool
,[Bool]
等。
答案 1 :(得分:4)
在这种情况下,b
是更高级的类型,即从类型到类型的函数。听起来很吓人?不要害怕!较高的kinded类型类似于列表类型。它自己的([])
不是一个类型,但它仍然需要一个参数成为一个,所以([]) Int = [Int]
是一个类型。
种类与类型类型类似,完全应用类型的类型为*
。另一方面,列表的类型是* -> *
。因此,它需要*
类型(例如Int
)并返回一个类型(例如[Int]
)。其他示例包括Maybe
,IO
或类型为(->)
的函数类型* -> * -> *
,因为它仍然需要类型,参数类型和结果类型(例如{{ 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告诉我们,没有任何(非⊥)条款具有这种类型。