我有一个任务,代码很容易理解,但我找不到可能的解决方案。那是代码:
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)
所以问题是:对于哪个输入(两个函数都相同),两个函数的布尔值都不同,例如第一个为true,第二个为false,反之亦然。因此,第一个函数单独测试两个列表,第二个函数测试列表的串联。昨天我整天都在想,完全不知道。你能帮助我找到应该用来解决这个问题的技巧吗?
答案 0 :(得分:2)
对于无限的"幸运" bs
和"不幸" as
,test_luck1
将终止,而test_luck2
则不会。
这些函数以不同的顺序测试值,因为catenate
的实现(有点奇怪),bs
在as
之前。因此,test_luck1
首先测试as
,然后bs
,而test_luck2
首先测试bs
,然后as
。
P.S。这可以看作是一个边界案例,根据@Mark Seemann的评论 - 对于扰流板感到遗憾;)
答案 1 :(得分:0)
再看看这个,我觉得我的评论太快了。除了shinobi的回答,我不知道这两个函数会以何种方式返回不同的结果。
并非此证明任何内容,但我编写了一个QuickCheck属性来验证假设test_luck1
将始终返回与test_luck2
相同的结果:
prop :: [Integer] -> [Integer] -> Bool
prop as bs =
test_luck1 as bs == test_luck2 as bs
我一直在运行这个属性,有1,000,000个测试,而且它们都通过了,所以我不认为那里有任何正常的' as
和bs
的值会导致test_luck1
的输出与test_luck2
的输出不同。