Haskell递归 如何返回空列表并忽略递归生成的列表



我正在编写一个递归函数来构建列表,但有一些条件,如果满足,该函数应该忽略到目前为止构建的列表,而只是自己返回一个空列表。

一个简单的例子:

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时,它将忽略它构建的列表,只返回一个空数组[]而不是返回一个传递回已经建立的列表的空数组。

有没有办法在哈斯克尔做到这一点?我试过做return []但它给了我错误:

无法将预期类型"Int"与实际类型"[t0]"匹配

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

然后,我们可以稍后将带有fromMaybe :: a -> Maybe a -> aNothing值转换为空列表,尽管在这里使用Maybe可能是更好的主意,例如,这使我们能够区分func []func [14]

最新更新