在功能all
和any
的签名中,我看到了这一点:
Prelude> :t all
all :: Foldable t => (a -> Bool) -> t a -> Bool
Prelude> :t any
any :: Foldable t => (a -> Bool) -> t a -> Bool
但是,... -> t a ->...
是什么意思?
t
和a
都不都是类型变量吗?如果是这样,在Haskell中两个类型变量的并置意味着什么?
答案 0 :(得分:8)
t和类型变量都不都是吗?如果是这样,在Haskell中两个类型变量的并置意味着什么?
就像 data 构造函数可以采用 parameters (例如Just
)一样, type 构造函数也可以采用参数,这些参数就是类型。例如,Maybe
类型构造函数采用类型参数(例如Int
),然后是类型Maybe Int
。
例如,可以使用列表[]
来存储元素,但是仍然需要解析一个类型参数:列表将存储的对象的类型。 [] Int
或[Int]
就是Int
的列表。
现在Foldable
类型是可以折叠的类型。例如,列表[]
是Foldable
(请注意,我们使用[]
,而不是[a]
或[Int]
)以及Maybe
,或Tree
。大多数元素的“集合”都是Foldable
,尽管不是集合的类型可以是Foldable
,反之亦然。
all :: Foldable t => (a -> Bool) -> t a -> Bool
和any :: Foldable t => (a -> Bool) -> t a -> Bool
是可以在Foldable
上运行的函数。这样的好处是,我们可以写all
和any
来对a
的列表进行操作(所以[a]
),但是可以使用Maybe a
以及:您可以看到Maybe
是一种类型,它是包含 no 元素(Nothing
或完全 one 元素( Just x
和x
元素)。例如,我们可以这样写:
Prelude> all id Nothing
True
Prelude> all id (Just True)
True
Prelude> all id (Just False)
False
Prelude> all id []
True
Prelude> all id [True]
True
Prelude> all id [False]
False
Prelude> all id [False, True]
False
Prelude> all id [True, True]
True
all
因此可以用于列表Maybe
,但也可以用于许多其他类型。