我正在查看 function 的类型注释elem。它看起来像这样:
elem :: Eq a => a -> t a -> Bool
Run Code Online (Sandbox Code Playgroud)
我知道这Eq a =>是一个类型约束。所以a必须支持==。
但我不明白t a,这是从哪里来t的?它有什么作用?为什么有必要?
链接:https ://hackage.haskell.org/package/base-4.16.0.0/docs/Prelude.html#v:elem
是t一个Foldable类型类,因为它是在Foldableclass中定义的,所以签名是:
elem :: (可折叠 t , Eq a) => a -> t a -> Bool
elem因此不仅适用于列表 (where t ~ []),还适用于任何Foldable、 so t ~ Maybe、t ~ NonEmpty、t ~ Tree等。它的默认实现是 [src]:
Run Code Online (Sandbox Code Playgroud)elem :: Eq a => a -> t a -> Bool elem = any . (==)
因此,它检查 的任何元素是否Foldable等于查询元素。
因此,这意味着它也可以用于例如Maybe a可以Nothing被视为空集合的集合,以及Just x具有一个元素的集合:x,或者例如查看该元素是否是玫瑰树中的值之一Tree a。