トップページへ

関数mapの使用か別の方法について

Access Count : 1393

Copyright © 2021 TAKEHANA TADASHI
著作日時: 2021.03.23.火. 09:40:00 著作者、竹花 忠
関数mapの使用か別の方法について:
 リストからのデーターの順次取り出しとそのデーターを処理した結果を結果リストへ順次格納する処理をHaskell言語で記述するには、1つには、そのコードを、隠蔽して・非見える化して、くれている関数mapを使用するパターンがある。その場合には、取り出したデーターを処理する関数を『処理の関数』と表記することとして、また、データーの取り出しを行うリストを『リスト』と表記スルコトとしての、擬似コードとしては、
 map 処理の関数 リスト
と記述するだけである。それだけで、リストからの順次取り出しや結果のリストへの順次格納のコードは一切、目に触れることなく・記述することなく、リストから順にデーターを取り出し、処理の関数で処理した結果が結果リストに順次格納されたものが得られる。
 関数mapを使用すると、リストからのデーターの順次の出し入れを非常に手軽に便利に実現できる。
 その一方で、リストからのデーターの順次取り出しとそのデーターを処理した結果を結果リストへ順次格納するコードを、きっちり記述する・見える化した、パターンもある。
 見える化した・きっちり記述した、時のコード例は、下記のようになる。
 ただし、最初にパラメーターに設定するリストについては、『リスト』という表記を用いた。
 また、処理の結果については、『処理の結果』という表記を用いた。
 そのような擬似コードによるコード例を下記に示す。
 kansuh [] = []
kansuh (x:xs) = 処理の結果 : kaknsuh xs
 以上の2行が関数kansuhの定義の記述である。
 そして、この関数・この定義・この関数の定義、を呼び出す記述が、
 kansuh リスト
である。
 以上の2行の定義のコードと1行の関数の呼び出しのコードを記述するのが、リストからデーターの順次取り出しとそのデーターを処理した結果を結果リストへ順次格納するコードを、見える化・きっちり記述、した、パターンの例である・コードの例である。
 なぜなら、kansuh リスト、は、下記のように変遷展開してゆくものであるからである。
 kansuh リスト、の関数の呼び出しによって、関数の定義の記述のうちの、呼び出しの形式が一致するものが使用されて、その右の=の右辺の記述に置き換えられる。
 なので、kansuh リスト、は、パラメーターが[]ではないので、kansuh []の方ではなく、kansuh (x:xs)の方が使用される。
 従って、kansuh リストの記述が、=の右辺の、処理の結果 : kansuh xs、に置き換えられる。
 その際、呼び出し側の、kansuh リスト、の、リスト、が、呼び出された側の・定義の側の、(x:xs)で受け取られる。
 リストが(x:xs)で受け取られるということは、つまり、リストの先頭要素がxで受け取られ、その残余のリストがxsで受け取られるということである。
 そして、そのxは、処理されるデーターとしいて使われる。要するに、xは、処理の結果、の中で使われる。
 残余のリストxsは、置き換えられた記述の中の、関数の呼び出しのところで、パラメーターとして使われる。
 以上が、kansuh リスト、が、処理の結果 : kansuh xs、に置き換えられたところまでのことである。
 kansuh リスト、が、処理の結果 : kansuh xs、に置き換えられた。なので、置き換えられた記述の中に、関数の呼び出しの記述がある。そこで、その関数の呼び出しの記述によって、さらに関数の呼び出しがなされる、つまり、処理の結果 : kansuh xs、への置き換えがなされる。
 であるから、ここまでで、kansuh リスト、は、処理の結果 : kansuh xs、を経て、処理の結果 : 処理の結果 : kansuh xs、に置き換えられる。
 最初の置き換えは、kansuh リスト、に対して行われ、次の置き換えは、処理の結果 : kansuh xs、の、kansuh xs、に対して行われる。
 この2回目の、kansuh xs、から、処理の結果 : kansuh xs、への置き換えは、定義を呼び出す時の関数の呼び出しのパラメーターに最初のxsを使用してのものである。
 つまり、初回の置き換えで得られた、処理の結果 : kanush xs、のxsは、初回のxs、つまり、先頭要素が欠落したリスト、である。その初回のxsを(x:xs)で受け取った時のxsが、2回目に置き換わった、処理の結果 : kansuh xs、のxsである。だから、このxsは、当初のリストの第3要素以降から成るリストである。そしてこの時のxは、当初のリストの第2要素を受け取っている。
 であるから、このように関数の呼び出しが連鎖すると、関数の呼び出しを重ねるごとに、最初のxには先頭の要素が、次の時のxには第2要素が、その次の時のxには第3要素が、・・・受け取られる。
 そして、その時その時の、kansuh xs、のxsには、その時その時のxが受け取っている要素の次の要素からのリストが、設定されている。
 また、その時その時の、処理の結果、は、その時その時のxを使っての処理の結果である。

 この関数の呼び出しの連鎖によって、xは、当初のリストの先頭の要素から始まって、毎回、次の要素に切り替わってゆく。また、xの次の要素からのリストであるxsは、毎回、1要素ずつ短くなつてゆく。受け取ったリストの先頭要素を削除したリストがxsであり、そして、以降、その1要素分短くなったリストを受け取って、またその先頭の1要素を削除したリストをxsとしてゆく。その連鎖であるから、xsは毎回、1要素ずつ短くなってゆく。
 だから、毎回、その時のxの処理の結果、を出力し、そして毎回、xsは1要素ずつ短くなったものが、関数kansuhのパラメーターに設定されての関数の呼び出し、間に:を挟んで、という記述に置き換えられてゆく、関数の呼び出しの部分が。
 なので、処理の結果 : ・・・ : kansuh xs、は、ついには、処理の結果 : ・・・ : kansuh []、に至る。xsは、毎回1要素ずつ短くなるので、ついには、空リスト・[]、に至るから。従って、呼び出される定義が、kansuh (x:xs)の方ではなく、kansuh []の方に切り替わる。
 その切り替わった、kansuh [] = []、では、呼び出しを行った、kansuh []、の記述を、[]、に置き換える、ということである。
 従って、ここに至って、関数の呼び出しを含まない記述、[]、に到達。関数の呼び出しの記述がないので、関数の呼び出しの連鎖が終結する。
 処理の結果 : ・・・ : kansuh []、の記述の、kansuh []、が、[]、に置き換えられるので、処理の結果 : ・・・ : []が得られる。
 つまり、[処理の結果, ・・・]、が得られる。
 すなわち、当初のリストの第1要素の処理の結果から順に、各要素の処理の結果、が順に格納された結果リストが得られる。
 であるから、
 kansuh [] = []
 kansuh (x:xs) = 処理の結果 : kansuh xs
の2行の定義の記述は、リストからデーターを順次取り出し、そのデーターを処理した結果を結果リストに順次格納するコードである。

 関数mapを使用すれば、同じことが、非常に手軽に便利で達成できる。
 ただし、mapを使用せずに、直接、コードをきっちり記述するパターンの方が応用が利く。
 パラメーターの値によって、結果リストへの出力を見合わせたりとか、処理の結果によっては結果リストへの出力を見合わせたりとか、あるいは、パラメーターを増やして、そのパラメーターに関数の呼び出しの連鎖途中の中間結果を保持させての処理の実現とか。
 直接、コードをきっちり記述するパターンが理解できていれば、少し改良を加えることで、上述のような応用パターンが実現できる。
 応用した記述が必要なことがあるので、直接、コードをきっちり記述した場合の、各コードとそれが担っている各処理、の対応をまず理解する。
 さらに、そのコード群で構成されている関数の呼び出し、゛か連鎖した時に、どういう展開を辿ってどういうことが実現されるのかまでしっかり把握する。
 それらを果たした上で、直接、コードをきっちり記述して関数を書き上げてしまえる力をつけておくことが大切である。