首页 > 解决方案 > 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>

标签: listhaskellrecursionreturn

解决方案


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]例如。


推荐阅读