无需过多放弃,因为这是家庭作业,这里有一些提示。
你知道列表推导吗?在这种情况下,它们会很有用。例如,您可以将它们与if
表达式结合起来执行以下操作:
*Main> let starS s = [if c == 's' then '*' else ' ' | c <- s]
*Main> starS "schooners"
"* *"
您甚至可以使用它们进行过滤。例如:
*Main> let findFives xs = [x | x <- xs, x == 5]
*Main> findFives [3,7,5,6,3,4,5,7,5,5]
[5,5,5,5]
这些都不是一个完整的答案,但不难看出如何使这些结构适应您的情况。
您还应该考虑一下您是否真的需要一个守卫!例如,这是一个使用与您的风格相同的守卫编写的函数:
lensMatch [] [] = True
lensMatch xs ys
| ((length xs) == (length ys)) = True
| otherwise = False
这是一个做同样事情的函数!
lensMatch' xs ys = length xs == length ys
您可以看到它们是相同的;测试第一个:
*Main> lensMatch [1..4] [1..4]
True
*Main> lensMatch [1..4] [1..5]
False
*Main> lensMatch [] [1..5]
False
*Main> lensMatch [] []
True
并测试第二个:
*Main> lensMatch' [1..4] [1..4]
True
*Main> lensMatch' [1..4] [1..5]
False
*Main> lensMatch' [] [1..5]
False
*Main> lensMatch' [] []
True
最后,我非常同意 sblom 的上述评论;zeros [] []
应该是True
!考虑以下语句:“对于集合 s 中的每个项目 x,x > 0”。如果 set s 为空,则该语句为真!这是真的,因为 s 中根本没有任何项目。在我看来,这就像一个类似的情况。