list - 串联前后的列表检查具有不同的结果

标签 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)

所以问题是:对于哪个输入(两个函数相同),两个函数的 boolean 值不同,例如第一个为 true,第二个为 false,反之亦然。因此,第一个函数单独测试两个列表,第二个函数测试列表的串联。我昨天想了一整天,完全没有想法。你们能帮我找到解决这个问题的技巧吗?

最佳答案

对于无限的“lucky”bs和“unlucky”astest_luck1将终止,而test_luck2将终止不是。

由于 catenate 的实现(有点奇怪),这些函数以不同的顺序测试值,它将 bs 前置到 as。因此,test_luck1 首先测试 as,然后测试 bs,而 test_luck2 首先测试 bs ,然后as

附注根据 @Mark Seemann 的评论,这可以被视为一种边界情况 - 抱歉剧透;)

关于list - 串联前后的列表检查具有不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44970524/

相关文章:

列表列表的python计数器?

haskell - 在 Yesod 和 Keter 中传递应用程序 secret

Haskell,QuickCheck,伪造(错误的)属性 :

Python 零值

java - 返回既不是 JNI_FALSE 也不是 JNI_TRUE 的 jboolean 的 JNI native 方法

sql - 空值 - boolean 表达式

r - 在R中的每个元素列表中添加前缀

c++ - 适用于 begin() 但不适用于 rbegin() 的映射迭代器

python - 过滤字典列表以始终返回单个字典,给定要查找的默认键值

haskell - Integer 没有 Monoid 实例