在Haskell中搜索无限矢量列表的非递归方式?

Ana*_*Ana 0 recursion haskell list vector

我有一个如下的数据结构:

import qualified Data.Vector.Unboxed as V
mylist :: [V.Vector (Int, Int)]
Run Code Online (Sandbox Code Playgroud)

我需要搜索这个向量列表来寻找满足谓词的元素.该算法保证我会找到该元素.

到目前为止,我有这样的事情:

go []     = error "Could not find"
go pred (p:ps) =
  case V.find pred p of
    Just a  -> a
    Nothing -> go ps
Run Code Online (Sandbox Code Playgroud)

这很简单,但我想摆脱递归.是否有一个构造可以让我"组合"递归?

Dan*_*ner 5

使用newtype包,可以方便地编写

import Control.Newtype
import Data.Monoid
import Data.Foldable

go :: Foldable f => (a -> Maybe b) -> f a -> Maybe b
go = ala' First foldMap
Run Code Online (Sandbox Code Playgroud)

我认为很好地暴露了你在这个计算中使用的结构.

  • 对于那些和我一样被魔术"ala"函数搞糊涂的人来说,这只是`\ f - > getFirst.F.foldMap(首先.f)`. (2认同)