如何在Haskell中找到'infinite'可折叠结构的第k个元素?

How to find the kth element of an 'infinite' Foldable structure in Haskell?

我想定义一个函数,safeIndex 适用于 Foldable 类型

safeIndex :: (Foldable t, Integral i) => t a -> i -> Maybe a
safeIndex = foldr step (const Nothing)
  where
    step :: Integral i => a -> (i -> Maybe a) -> i -> Maybe a
    step x f i = if i == 0
               then Just x
               else f (i - 1)

但它不适用于无限列表。 foldr要停在中间,我想我们必须确定它是否应该只在step的第一个参数处停止,这似乎是不可能的。

是否可以修复该函数以使其适用于无限结构?如果不是,我们应该将 t 限制为哪些类型类?

如果您不介意依赖,Gabriel Gonzalez 的 foldl library 提供了适合您目的的 indexgenericIndex 折叠。

例如,您可以写

safeIndex :: (Foldable f, Integral a) => a -> f b -> Maybe b
safeIndex = fold . genericIndex

除此之外,您 post 编写的代码似乎符合您的预期。

编辑:我将 "infinite lists" 位隔开。

这适用于无限列表,但我不知道是否有一种明智的方法可以为所有 Foldable 定义它。

safeIndex' :: Int -> [a] -> Maybe a
safeIndex' n = listToMaybe . foldr (.) id (replicate n (drop 1))

编辑 2:

从头开始,原始 post 中的内容应该适用于任何 Foldable

实际上问题描述中的定义已经适用于无限内置列表。是其他一些错误让我认为它不能 ;)(查看评论。)