[英]What does the type a -> b Bool mean in Haskell?
我知道这种类型:
a -> Bool
是一个将类型a的东西作为输入并输出布尔值的函数。
键入什么:
a -> b Bool
意思?
在b Bool
, b
代表采用一个类型参数的参数化类型(在Haskell看来, b
是类型* -> *
的类型构造函数),例如Maybe
, IO
或[]
。
因此, a -> b Bool
类型的函数可以采用一个Int
并生成Maybe Bool
, IO Bool
, [Bool]
等。
在这种情况下, b
是种类更高的类型,即从类型到类型的函数。 听起来吓人吗? 不要怕! 更高种类的类型类似于列表类型。 ([])
本身不是类型,但是它仍然需要一个参数才能成为一个类型,因此([]) Int = [Int]
是一种类型。
种类就像类型的类型,完全应用类型的类型是*
。 另一方面,列表的类型为* -> *
。 因此,它采用类型*
(例如Int
)并返回类型(例如[Int]
)。 其他示例可能是Maybe
, IO
或具有类型* -> * -> *
的函数类型(->)
,因为它仍然需要处理类型,参数类型和结果类型(例如(->) Int Bool = Int -> Bool
)。
您提供的函数实际上是无法实现的,就像类型a -> b
的函数一样。 但是,我们可以实现的功能如下:
pureEq :: (Eq a, Applicative b) => a -> a -> b Bool
pureEq x y = pure (x == y)
如果使用显式量化和种类注释将其写出,可能会更清楚。 a -> b Bool
表示...
forall (a :: *) (b :: * -> *). a -> b Bool
因此, b
是采用单个类型参数的类型构造函数。 单参数类型构造函数的示例比比皆是: Maybe
[]
和IO
都是可用于实例化b
的事物的示例。
函数f :: a -> b Bool
接受任何类型a
的参数; 它的返回值是您选择的类型构造函数,其参数填充为Bool
。
参数告诉我们,没有任何(非⊥)项具有这种类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.