我正在编写一个递归函数来构建列表,但有一些条件,如果满足,该函数应该忽略到目前为止构建的列表,而只是自己返回一个空列表。
一个简单的例子:
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 -> a
的Nothing
值转换为空列表,尽管在这里使用Maybe
可能是更好的主意,例如,这使我们能够区分func []
和func [14]
。