我正在尝试计算具有递归代码的列表列表中非空列表的数量。我的目标是写一些简单的东西:
prod :: Num a => [a] -> a
prod [] = 1
prod (x:xs) = x * prod xs
Run Code Online (Sandbox Code Playgroud)
我已经有了定义和边缘条件的想法:
nonEmptyCount :: [[a]] -> Int
nonEmptyCount [[]] = 0
Run Code Online (Sandbox Code Playgroud)
我不知道如何继续,有什么提示吗?
我认为您的基本情况可以简化。作为基本情况,我们可以采用空列表[],而不是带空列表的单例列表。对于递归情况,我们可以考虑(x:xs)。在这里,我们需要区分x是空列表x还是非空列表。我们可以通过模式匹配或使用警卫来做到这一点:
nonEmptyCount :: [[a]] -> Int
nonEmptyCount [] = 0
nonEmptyCount (x:xs) = -- …Run Code Online (Sandbox Code Playgroud)
话虽如此,您根本不需要递归。您可以首先过滤列表,省略空列表,然后在该列表上调用长度:
nonEmptyCount :: [[a]] -> Int
nonEmptyCount = length . filter (…)Run Code Online (Sandbox Code Playgroud)
在这里您仍然需要填写…。