如何在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 提供了适合您目的的 index
和 genericIndex
折叠。
例如,您可以写
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
。
实际上问题描述中的定义已经适用于无限内置列表。是其他一些错误让我认为它不能 ;)(查看评论。)
我想定义一个函数,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 提供了适合您目的的 index
和 genericIndex
折叠。
例如,您可以写
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
。
实际上问题描述中的定义已经适用于无限内置列表。是其他一些错误让我认为它不能 ;)(查看评论。)