连接前后的列表检查,结果不同

时间:2017-07-07 12:15:11

标签: list haskell boolean concatenation predicate

我有一个任务,代码很容易理解,但我找不到可能的解决方案。那是代码:

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,反之亦然。因此,第一个函数单独测试两个列表,第二个函数测试列表的串联。昨天我整天都在想,完全不知道。你能帮助我找到应该用来解决这个问题的技巧吗?

2 个答案:

答案 0 :(得分:2)

对于无限的"幸运" bs和"不幸" astest_luck1将终止,而test_luck2则不会。

这些函数以不同的顺序测试值,因为catenate的实现(有点奇怪),bsas之前。因此,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个测试,而且它们都通过了,所以我不认为那里有任何正常的' asbs的值会导致test_luck1的输出与test_luck2的输出不同。