トップページへ

リストの全データを処理する関数

Access Count : 10777

Copyright © 2020 TAKEHANA TADASHI
著作日時: 2020.03.17.火. 17:09:00 著作者、竹花 忠
リストの全データを処理する関数:
funcPlus [] = 0
funcPlus (x:xs) = x + funcPlus xs

 こう記述しておけば、funcPlus [1,2,3,4]は、再帰呼び出しによって、1 + 2 + 3 + 4 + 0へと展開されて、10が返り値として得られる。
 なぜなら、funcPlus [1,2,3,4]は、まず、funcPlus (x:xs) = x + funcPlus xsの記述によって、1 + funcPlus [2,3,4]に置き換えられる。
 さらに、funcPlus [2,3,4]が、同上の記述によって、2 + funcPlus [3,4]に置き換えられる。したがって、1 + 2 + funcPlus [3,4]となった。
 さらに同様にして、1 + 2 + 3 + funcPlus [4]に置き換えられ、さらに、1 + 2 + 3 + 4 + funcPlus []に置き換えられる。
 そしてこの末尾のfuncPlus []は、funcPlus [] = 0の記述によって、0に置き換えられる。したがって、1 + 2 + 3 + 4 + 0に置き換わる。
 なので最終的に、前記の式を、評価して・計算して、10に置き換わる。
 つまり、関数呼び出しの記述は、常に、その定義の記述に置き換える。
 なお、
funcPlus [] = 0
funcPlus (x:xs) = x + funcPlus xs
の各式の右辺の式が、左辺の式の定義である。
 ここで、(x:xs)は、全体で引数のリストを表している。そして、その引数のリストの先頭の要素がxにわたされる。その後続のリストがxsにわたされる。ということを表している。
 なので、この2行の定義によって、funcPlus [1,2,3,4]は、1 + 2 + 3 + 4 + 0に置き換えられ、10になる。

 この関数にリストが引数としてわたされたのであったら、先頭の1件のデータ、そして、2項演算子、そして、その後続のリストをこの関数の引数にした記述・その後続のリストをこの関数で処理する記述、に置き換える。
 ただそれだけで構成されるコードを書けば、『その後続のリストをこの関数の引数にした記述・その後続のリストをこの関数で処理する記述』の部分が、次々に、『先頭の1件のデータ、そして、2項演算子、そして、その後続のリストをこの関数の引数にした記述・その後続のリストをこの関数で処理する記述』に置き換わる。
 それによって、リストのデータが先頭から順に、間に、2項演算子を挟んで並んで、1 + 2 + 3 + 4、そして、最後、2項演算子の次に、『[]をこの関数の引数にした記述・[]をこの関数で処理する記述』、つまり、+ funcPlus []が並んだ記述が得られる。
 要するに、1 + 2 + 3 + 4 + funcPlus []が得られる。
 これは引数のリストが[1,2,3,4]であった場合のことである。
 引数のリストが[1,2,3,4,5,6,7]であった場合には、つまり、funcPlus [1,2,3,4,5,6,7]であった場合には、
1 + 2 + 3 + 4 + 5 + 6 + 7 + funcPlus []が得られる。
 引数のリストが[2,3,5,7,11,13]であった場合には、つまり、funcPlus [2,3,5,7,11,13]であった場合には、
2 + 3 + 5 + 7 + 11 + 13 + funcPlus []が得られる。
 であるから、funcPlus []の時の定義を、2項演算子にとっての単位元にしておく。つまり、[]をこの関数の引数にした記述の時の定義を、使用している2項演算子にとっての単位元にしておく。
 そのような定義と、[]ではないリストをこの関数の引数にした記述の時の定義としては、『先頭の1件のデータ、そして、2項演算子、そして、その後続のリストをこの関数の引数にした記述・その後続のリストをこの関数で処理する記述』という定義を揃える。
 そうすれば、引数のリストの全要素を単一の2項演算子で演算した値が、リストをこの関数の引数にした記述の返り値として得られる。
 単位元とは、その値を使用して演算を行った時、演算結果に変化を生じさせることのない値のことである。
 であるから、足し算の時には、0が単位元である。0を使用して足し算を行った場合、足し算の前後で値は変化しないから。17 + 0は17のままで、0 + 17も17のままで値が変化しない。なのて、0は、足し算における単位元である。
 掛け算の時には、1が単位元である。1を掛けても元の値のままで変化を生じない。1に掛け算をしても元の値のままで変化を生じない。なので、掛け算では1が単位元である。

 したがって、リストの全要素を掛け算で集約化した値を得たい時には、たとえば、
funcMulti [] = 1
funcMulti (x:xs) = x * funcMulti xs
という2行の定義を用意すればいい。
 ここで、*は、掛け算の、記号・2項演算子、である。
funcMulti [1,2,3,4]とすれば、1 * 2 * 3 * 4 * 1によって、24が得られる。
funcMulti [2,3,5,7]とすれば、2 * 3 * 5 * 7 * 1によって、210が得られる。
funcMulti [1,1,2,3,5,8]とすれぱ、1 * 1 * 2 * 3 * 5 * 8 * 1によって、240が得られる。