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

Joh*_*han 2 haskell

我正在使用容器库,我试图在REPL中使用这种方法从集合中提取第一个元素:

let initialSet = insert "x" empty
let setWithTwoElems = insert "y" initialSet
elemAt 0 (filter (\v -> v == "x") setWithTwoElems)
Run Code Online (Sandbox Code Playgroud)

如果传递给过滤器的谓词与Set中的任何元素都不匹配,那么这是行不通的.如果我这样做:

elemAt 0 (filter (\v -> v == "z") setWithTwoElems)
Run Code Online (Sandbox Code Playgroud)

它会爆炸说:

"*** 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
Run Code Online (Sandbox Code Playgroud)

哪种蔑视使用Haskell的目的?我想要类似于elemAt(或只是first)返回Maybe结果的东西.

我怎样才能做到这一点?

aoc*_*via 5

您正在寻找的功能被称为find来自Data.Foldable.

文档:

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

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

  • 或者`find(=="x")setWithTwoElems`;) (5认同)