在函数 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 中意味着什么?
最佳答案
Isn't both t and a a type variable? if so, what does the juxtapositions of two type variable mean in Haskell?
就像data构造函数可以接受参数一样(例如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
视为一种类型,该类型是包含不的集合元素(Nothing
),或恰好一个元素(Just x
with x
the element)。例如我们可以这样写:
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
可以在列表上工作,也许
,但也可以在许多其他类型上工作。
关于haskell - Haskell 中的类型签名中的 `... -> t a ->...` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51581150/