2009年7月20日月曜日

ブール型を返す冗長な関数

昔書いたコードを眺めていて、当時は違和感はなかったのだけれど、今見ると「あれ?」(@_@;) と思うものがあった。例えば、Python で「与えられた数が 10 未満であるかどうかを調べる関数」が次のように記述されていたとする。

def lessthan10(x):
    if (x < 10):
        return True
    else:
        return False

上記は次にように書けば 2 行で済む。

def lessthan10(x):
    return x < 10

ブール型を返す関数をチェックしてブール型を返すというパターンの関数において、他にも同じように冗長に書いているものがいくつかあった。以前は前者の書き方の方が見たときにパッと理解しやすく、後者はシンプルだけれど感覚的に何となく好きになれなかった。

上記をまとめると、

It is alway possible to replace the pattern if (E) {return true;} else {return false;} by the pattern return E;

(Simplifying Boolean Expressions and Conditionals より)

 

ところで、なぜ冗長だと気にかかるようになったかと考えてみると、Haskell で同じ関数を書くとするならセクションを使って

lessthan10 = (< 10)

面倒なので次のようには書かないし、

lessthan10 x = if x < 10 then True else False

ましてや次のようにも書かない。

lessthan10 x = case x < 10 of
                 True      -> True
                 otherwise -> False

lessthan10 x = case x of
                 x | x < 10 -> True
                 otherwise  -> False

嗜好が変わってきたのかなぁ~。言語が思考を規定すると言ったら大袈裟か。。 ^^; やっぱ習慣の引力?

 

参考