ユダヤの法則(78 : 22の法則)のHaskellコード

ユダヤの法則とは

ユダヤの法則は、世の中はすべて78:22の割合で成り立っているという考え方です。

また、「78 : 22の法則」とも言います。

例えば、以下のような事実があります。

①地球の海と陸地の割合は、海の78%に対して陸地が22% ②空気中の成分の割合も窒素が78%に対して酸素が22% 『78:22の法則』から学ぼう | 今週の朝礼

ユダヤの法則で考える

大切なことは、人間にとって初めてやることは、勉強にしろ、スポーツにしろ、なんであれ「どんなに頑張っても78%しか達成できない」ということを自覚し、この不完全の22%を次にどう活かすかです。そして、次にやるときは、この22%を100と考えて、最大限の努力をしていく。そうすると1回目では最大限78%の達成度が、2回目では78%+22%×0.78=95%へとレベルアップしたことになり、これを何回も何回も繰り返すことで、限りなく100%に近づいていくことになります。どんな分野でも一流と呼ばれる人は、自分の最大限の努力を何回も何回も繰り返しているのです。『78:22の法則』から学ぼう | 今週の朝礼

Haskellコード

上の考えをHaskellのコードで表現すると以下のようになる。

import           Data.Tuple  (uncurry)
import           Text.Printf (printf)

judeas :: [Double]
judeas = let xs = iterate (* 0.22) (100 * 0.78)
         in scanl1 (+) xs

main :: IO ()
main = do
    mapM_ (uncurry $ printf "%d\t%.2f\n") $
        zip [1::Int ..] $ take 5 judeas

実行結果は以下のようになる。

src/haskell % stack runghc judea.hs
1  78.00
2  95.16
3  98.94
4  99.77
5  99.95

ソースコード解説

judeasのコードを解説する。

1回目では78% = (100 * 0.78)

2回目では95% = (100 * 0.78) + (100 * 0.78 * 0.22)

3回目では98% = (100 * 0.78) + (100 * 0.78 * 0.22) + (100 * 0.78 * 0.22 * 0.22)

...

となっている。ここでiterate (* 0.22) (100 * 0.78)について考える。

なお、iterate f x[x, f x, f (f x), ...]というリストを生成する。したがって、iterate (* 0.22) (100 * 0.78)の結果は以下のようなリストになる。

[ 100 * 0.78
, 100 * 0.78 * 0.22
, 100 * 0.78 * 0.22 * 0.22
, ...
]

したがって、上で作った各リストをscanl1 (+) xsで畳み込んだ結果が求めるリストになる。

なお、scanl1foldl1 f xsで畳み込んだ時の各繰り返しごとの結果の値をリストにして返す関数です。

参考