从Haskell中获取Set中的第一个元素(如果存在)

时间:2017-12-05 09:02:05

标签: haskell

我正在使用containers库,并尝试在REPL中使用此方法从集合中提取第一个元素:

let initialSet = insert "x" empty
let setWithTwoElems = insert "y" initialSet
elemAt 0 (filter (\v -> v == "x") setWithTwoElems)

虽然传递给过滤器的谓词与Set中的任何元素都不匹配,但这样做并不安全。如果我这样做:

elemAt 0 (filter (\v -> v == "z") setWithTwoElems)
它会爆炸说:

"*** Exception: Set.elemAt: index out of range
CallStack (from HasCallStack):
  error, called at libraries/containers/Data/Set/Base.hs:1186:16 in containers-0.5.7.1:Data.Set.Base

哪种无视使用Haskell的目的?我喜欢与elemAt(或仅first)类似的内容,而是返回Maybe结果。

我该怎么做?

1 个答案:

答案 0 :(得分:5)

您要查找的功能名为find,来自Data.Foldable

来自documentation

  

find函数接受谓词和结构,并返回与谓词匹配的结构的最左边元素,如果没有这样的元素,则返回Nothing。

因此,您可以使用find (\v -> v == "x") setWithTwoElems