Haskell 递归显然具有非穷举模式

Haskell 递归显然具有非穷举模式,haskell,Haskell,我的函数rtnDryPlaces应该返回一个列表,列出所有干燥的地方,如果它们在某一天是干燥的——第一天是昨天(最后一个元素),第七天是上周(第一个元素) 第二个守卫反转列表并返回该索引处的元素(索引为day)。如果返回0,则名称a将附加到当天也返回0的名称列表中。当测试数据用完时,降雨数据也会用完,所以我将停止条件设置为当d=[]问题之一是递归调用最终将到达空列表,并且您没有为此定义结果: rtnDryPlaces :: [Place] -> Int -> [Name] rtnDr

我的函数rtnDryPlaces应该返回一个列表,列出所有干燥的地方,如果它们在某一天是干燥的——第一天是昨天(最后一个元素),第七天是上周(第一个元素)


第二个守卫反转列表并返回该索引处的元素(索引为day)。如果返回0,则名称a将附加到当天也返回0的名称列表中。当测试数据用完时,降雨数据也会用完,所以我将停止条件设置为当d=[]

问题之一是递归调用最终将到达空列表,并且您没有为此定义结果:

rtnDryPlaces :: [Place] -> Int -> [Name]
rtnDryPlaces [] _ = []
rtnDryPlaces ((a,(b,c),d):xs) n
    | d == [] = []
    | (reverse d)!!n-1 == 0 = a:rtnDryPlaces xs n
现在,这将给我们一个结果:

Prelude> rtnDryPlaces testData 2
["London","Cardiff"]
但是我们仍然可以通过使用
过滤器
映射
使其更加优雅:

rtnDryPlaces :: [Place] -> Int -> [Name]
rtnDryPlaces ps n = map (\(x,_,_) -> x) (filter p ps)
    where p (_,_,d) | (0:_) <- drop (n-1) (reverse d) = True
                    | otherwise = False
rtnDryPlaces::[Place]->Int->[Name]
rtnDryPlaces ps n=map(\(x,\,\)->x)(过滤器p ps)
其中p(u,u,d)|(0:)Int->[名称]

rtnDryPlaces ps n=[p |(p,d)
rtnDryPlaces[]
未定义。仅定义了
rtnDryPlaces((a,(b,c),[]):
。打开警告将报告此情况。我如何定义它?您只需编写
rtnDryPlaces[].=
当我在警卫上方编写语句时,它总是给我一个解析错误,并且没有实例(数字[名称])由写入时的文字“0”错误引起below@jamie很难猜测您到底写了什么以及可能出现的错误。如果您希望得到帮助,请尽可能清楚。例如,在问题中包含新代码,或者用新代码问一个新问题。或者列出理解:
[x |(x,|,d)
Prelude> rtnDryPlaces testData 2
["London","Cardiff"]
rtnDryPlaces :: [Place] -> Int -> [Name]
rtnDryPlaces ps n = map (\(x,_,_) -> x) (filter p ps)
    where p (_,_,d) | (0:_) <- drop (n-1) (reverse d) = True
                    | otherwise = False
rtnDryPlaces :: [Place] -> Int -> [Name]
rtnDryPlaces ps n = [p | (p, _, d) <- ps, 0 <- take 1 . drop (n-1) . reverse $ d]