我有一个作业,代码非常容易理解,但我找不到可能的解决方案。这就是代码:
lucky:: [Integer] -> Bool
lucky (xs) = all (/=13) xs
catenate as [] = as
catenate as (b:bs) = b : (catenate as bs)
test_luck1 as bs = lucky as && lucky bs
test_luck2 as bs = lucky (catenate as bs)
所以问题是:对于哪个输入(两个函数相同),两个函数的 boolean 值不同,例如第一个为 true,第二个为 false,反之亦然。因此,第一个函数单独测试两个列表,第二个函数测试列表的串联。我昨天想了一整天,完全没有想法。你们能帮我找到解决这个问题的技巧吗?
最佳答案
对于无限的“lucky”bs
和“unlucky”as
,test_luck1
将终止,而test_luck2
将终止不是。
由于 catenate
的实现(有点奇怪),这些函数以不同的顺序测试值,它将 bs
前置到 as
。因此,test_luck1
首先测试 as
,然后测试 bs
,而 test_luck2
首先测试 bs
,然后as
。
附注根据 @Mark Seemann 的评论,这可以被视为一种边界情况 - 抱歉剧透;)
关于list - 串联前后的列表检查具有不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44970524/