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 ~ Maybe
、t ~ NonEmpty
、t ~ Tree
, 等等 它的 default implementation is [src]:
elem :: Eq a => a -> t a -> Bool
elem = any . (==)
因此它检查 Foldable
的任何元素是否等于查询元素。
这意味着它也可以用于 Maybe a
例如,其中 Nothing
可以看作是一个空集合,而 Just x
可以看作是一个元素的集合:x
,或者例如查看元素是否是玫瑰树 Tree a
.
中的值之一
我正在查看函数 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 ~ Maybe
、t ~ NonEmpty
、t ~ Tree
, 等等 它的 default implementation is [src]:
elem :: Eq a => a -> t a -> Bool elem = any . (==)
因此它检查 Foldable
的任何元素是否等于查询元素。
这意味着它也可以用于 Maybe a
例如,其中 Nothing
可以看作是一个空集合,而 Just x
可以看作是一个元素的集合:x
,或者例如查看元素是否是玫瑰树 Tree a
.