list - Haskell Recursion如何返回一个空列表并忽略递归生成的列表
问题描述
我正在编写一个构建列表的递归函数,但有一些条件,如果满足,该函数应该忽略到目前为止已经构建的列表并简单地返回一个空列表。
一个简单的例子:
func (x:xs)
| x < 10 = [x] ++ func xs
| otherwise = ("return an empty list without the already built up list")
因此,如果xs
是一个列表[1 .. 12]
,那么一旦它构建了一个列表,[1..9]
然后当它到达时10
,它将忽略它构建的列表,只返回一个空数组[]
,而不返回一个空数组,该数组传回已经建立的列表。
有没有办法在 Haskell 中做到这一点?我试过做return []
,但它给了我错误:
无法将预期类型“Int”与实际类型“[t0]”匹配</p>
解决方案
return
不是 Haskell 中的声明,但即使是这样,它也不会起作用。由于由于递归,然后您返回该特定级别的列表。
然而,看起来您只是想知道所有元素是否都小于10
. 如果是这种情况,则返回整个列表,否则返回一个空列表。
你可以这样做:
func :: (Num a, Ord a) => [a] -> [a]
func xs | all (< 10) xs = xs
| otherwise = []
或者我们可以使用递归,并利用Maybe
:
func :: (Num a, Ord a) => [a] -> Maybe [a]
func [] = Just []
func (x:xs) | x < 10 = fmap (x:) (func xs)
| otherwise = Nothing
然后我们可以稍后将Nothing
值转换fromMaybe :: a -> Maybe a -> a
为一个空列表,尽管在Maybe
这里可能是更好的主意,它允许我们区分func []
和func [14]
例如。
推荐阅读
- javascript - 使用数据属性中的值检查链接单击上的复选框(可能在更改冲突时?)
- javascript - 如何根据 JavaScript 中变量的值更改 CSS 类?
- swift - 如何为 CollectionView Cell 指定行数、列数和间距
- swift - 是否有任何解决方法可以将存储的属性快速放入扩展中?
- assembly - 一个词在给定语句中使用了多少次。MIPS MARS 组件
- rest - REST API - 更多参数以方便使用
- r - 我如何摆脱 ¦ 登录我的数据
- c++ - int&referenceToA = a; 怎么样?可能的?
- python - 如何检查是否已经选择了某些内容?
- http - 托管在不同 Web 服务器上的 HTTP 请求对象的 TCP 连接