- 空のリストに対する
Enum.all? 関数の戻り値は true
- Haskell の
all、Python の all、Clojure の every? 関数も同じように動作
- 空のリストに対して true を返すと実装しやすい
true && f(elem1) && f(elem2) ...
- ただし、実装上の都合だけでそのように実装されているわけではない
- 論理学における空虚真 (vacuous truth) の定義に合うように実装されている
- 空虚真を理解するには、実質含意を見てみる必要がある
- p が偽なら p → q は常に真
- 「自由の女神像がソウルにあるなら、エッフェル塔は浦項にある」は真
- p である「自由の女神像がソウルにある」が偽だから
- このような実質含意で、p が偽であるため無条件に真になることを空虚真という
- 空虚真では、空集合 (set) についてはいかなる命題も真になる
- 「部屋の中のすべての携帯電話の電源が切れている」を例にすると
- x は部屋の中にあるすべてのもの
- P(x) は「x は携帯電話である」
- Q(x) は「x は電源が切れている」
- x が空であるため P(x) は偽。空虚真によって常に真になる。
- したがって、空のリストに対する
Enum.all? 関数の戻り値は true になる。
3件のコメント
勉強になりました、共有ありがとうございます。
数学的・計算機科学的なアプローチはこうだとしても、コーディング時には混乱しやすいので、活用しないほうがよさそうに思えます(笑)。
特に
if文では空のリストをFalseとして認識するので、かなり混乱します。Pythonでは以下の通りです。
all([]) == True
all([[]]) == False
だから私は、コードを読む人のために条件を明示的に書く方向を好みます。
if not arr:よりはif len(arr) == 0:のように。if not flag:の代わりにif flag is False:といった例もありますね。私の基準では、
all([[]])はall([条件式 for ... in []])と書き換えたほうが、コードがより読みやすくなると思います。ああ、Python では空のリストが falsy value なので、
all([[]])の戻り値がFalseになるんですね。言語ごとに Truthy、Falsy value が違うので、別の言語を使うときにたまにミスしてしまいます。 :)参考までに、Elixir は
nilまたはfalseだけが Falsy value なので、Enum.all?([[]])の値はtrueになります。