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

List Haskell递归如何返回空列表并忽略递归生成的列表,list,haskell,recursion,return,List,Haskell,Recursion,Return,我正在编写一个递归函数来构建一个列表,但是有一些条件,如果满足这些条件,函数应该忽略到目前为止已经构建的列表,只返回一个空列表 一个简单的例子: func (x:xs) | x < 10 = [x] ++ func xs | otherwise = ("return an empty list without the already built up list") func(x:xs) |x

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

一个简单的例子:

func (x:xs)
   | x < 10 = [x] ++ func xs
   | otherwise = ("return an empty list without the already built up list")
func(x:xs)
|x<10=[x]++func-xs
|否则=(“返回没有已建立列表的空列表”)
因此,如果
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 = []

随后,我们可以将
Nothing
值与转换为空列表,尽管此处使用
可能更好,这允许我们区分
func[]
func[14]

return
不是关键字或特殊语法。这是一个和其他函数一样的函数。
func :: (Num a, Ord a) => [a] -> Maybe [a]
func [] = Just []
func (x:xs) | x < 10 = fmap (x:) (func xs)
            | otherwise = Nothing