Haskell elem 函数定义有 t 你能解释一下吗

Haskell elem function definition has t a can you explain that

我正在查看函数 elem 的类型注释。它看起来像这样:

elem :: Eq a => a -> t a -> Bool 

我知道 Eq a => 是一个类型约束。 所以a必须支持==.

可是我不明白t a,这个t是从哪里来的? 它有什么作用?为什么有必要?

Link: https://hackage.haskell.org/package/base-4.16.0.0/docs/Prelude.html#v:elem

t是一个Foldable类型类,因为它是在Foldable class中定义的,所以签名是:

elem :: (Foldable t, Eq a) => a -> t a -> Bool
因此

elem 不仅适用于列表(其中 t ~ []),而且适用于任何 Foldable,因此 t ~ Maybet ~ NonEmptyt ~ Tree, 等等 它的 default implementation is [src]:

elem :: Eq a => a -> t a -> Bool
elem = any . (==)

因此它检查 Foldable 的任何元素是否等于查询元素。

这意味着它也可以用于 Maybe a 例如,其中 Nothing 可以看作是一个空集合,而 Just x 可以看作是一个元素的集合:x,或者例如查看元素是否是玫瑰树 Tree a.

中的值之一