Home >Backend Development >Python Tutorial >为什么函数式语言中all odd [] 得到True?

为什么函数式语言中all odd [] 得到True?

WBOY
WBOYOriginal
2016-06-06 16:23:371553browse

回复内容:

<code class="language-scala"><span class="nc">List</span><span class="o">().</span><span class="n">forall</span><span class="o">(</span><span class="n">f</span><span class="o">)</span>
</code>
我觉得其他答案里提到的 Vacuous truth 已经很简单地回答这个问题

<code class="language-haskell"><span class="kt">True</span> <span class="o">&&</span> <span class="n">x</span>  <span class="c1">-- => x</span>
<span class="nf">x</span> <span class="o">&&</span> <span class="kt">True</span>  <span class="c1">-- => x</span>
</code>
「所有元素都是奇數」等價於「沒有一個元素不是奇數」。
空集中一個元素都沒有,自然也就沒有「不是奇數的元素」。所以,空集中沒有一個元素不是奇數,亦即,空集的所有元素都是奇數。

如果一個集合的元素全都是奇數,那麼他的子集,其元素也應該全都是奇數。
{1} 顯然是「唯奇數集」,所以其子集 {} 也應當是「唯奇數集」。

初次見到 Vacuous truth 這一概念者往往會覺得不合常理、很難理解。但如果仔細考慮考慮,就會發現這是唯一符合常理的解釋。 @祖与占 说的“单位元”一语中的。

维基百科上Empty product这一篇解释得也很好。 设x1 x2为两个数组,

按照常理应该有odd(x1:::x2)=odd(x1)&odd(x2)

取x1=[] x2非空 得到 odd([])=true 从程序实现角度来看,满足全部是的最简单逻辑是存在一个不满足要求就返回非(循环判断),最后默认情况就是真,类似快速失败的策略,所以对于空集合结果为真。伪代码如下

<code class="language-text">for x in xs
  if x is not odd
    return false
return true
</code>
如果你自己用递归写判断一个数组是否为奇的方法


Head(x) x去掉最后一个元素
Tail(x) x的最后一个元素

odd(x)=odd(head(x)) && (tail(x)%2==1)【对不起语法有点忘了。。

于是当x只有一个元素时就是
odd(空集) && (tail(x)%2==1)


此时odd(空集)就只能为true all f xs 所表达的语义为:
xs中的所有元素都满足条件f
也即:
xs中不存在 不满足条件f 的元素

所以,[]中不存在...的元素,当然是True

语义上的原因如此,@Geek.cs已经说得很清楚了,实现上的细节 @祖与占 也已经说得很清楚了,

所以如果你设计标准库,设计一个通用的all函数,那么基本上不会是另外一种样子的。

当然如果你的具体应用场景中需要特殊处理空集,你可以再包装一个特化的all自己用,比如可以在接受[]的时候返回Nothing,当然那样返回值类型就是Maybe的了。 标准库里的实现,在不用返回Maybe的情况下,也能做到逻辑的自洽,那自然是不会选择实现成用起来这么麻烦的东西的。 short ver: 那你觉得应该返回啥?False?error ? Maybe Bool ? 数学上叫做vacuous truth: Vacuous truth 很久以前上拓扑课时经常用到

这个很符合直觉啊,为何题主会觉得反人类。就像wiki中的例子,如果一个人问“这个房间里所有的手机都关了吗?” 如果刚好房间里所有人都没带手机,正常人都不会回答否吧。

或许按逆否命题更好理解:array中没有偶数
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn