在 Haskell 的类型签名中,`... -> t a -> ...` 是什么意思?

3
在函数签名中,allany,我看到了这个:
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中两个类型变量的并置意味着什么呢?

2
t是带有参数的类型构造器。例如,如果aInt,那么该类型就是Maybe Int - Willem Van Onsem
@WillemVanOnsem 好的,这很有道理。谢谢你的回答。 - Our
3
最著名的可折叠类型t[]。就像将ta解释为[a]一样,但它更加通用。 - chi
1个回答

7
两个类型变量t和a,如果是这样的话,在Haskell中这两个类型变量的并置意味着什么? 就像一个数据构造器可以带有参数(例如Just),一个类型构造器也可以带有参数,这些参数是类型。例如Maybe类型构造器需要一个类型参数(例如Int),然后就成为了一个类型Maybe Int。 例如,可以使用列表[]来存储元素,但仍需解析一个类型参数:列表将要存储的对象的类型。[] Int或[Int]就是一个Int列表。
现在,Foldable类型是可以折叠的类型。例如,列表[]是一个Foldable(请注意,我们使用[],而不是[a][Int]),以及MaybeTree。大多数元素的“集合”都是Foldable,尽管不是集合的类型也可以是Foldable,反之亦然。

all :: Foldable t => (a -> Bool) -> t a -> Boolany :: Foldable t => (a -> Bool) -> t a -> Bool 是可以操作 Foldable 的函数。优点在于我们可以编写 allany 来操作一个 a 列表(即 [a]),但是也可以使用 Maybe a:你可以将 Maybe 视为一种类型,它是一个集合,其中要么不包含任何元素(Nothing),要么正好包含一个元素(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类型以及许多其他类型进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接