トップページへ

Haskell言語の関数の定義の3形式

Access Count : 1479

Copyright © 2021 TAKEHANA TADASHI
著作日時: 2021.03.26.金. 21:20:00 著作者、竹花 忠
Haskell言語の関数の定義の3形式:  関数の定義が、let-in形式で記述されている時は、関数の呼び出しの記述を、最終的には、inの後の記述で置き換える。
 letの後の記述は、inの後の記述における各値を確定させるための記述である。
例、
heihouOrRippou suh h_or_r =
 let
  k = if h_or_r == 'h'
     then suh * suh
     else if h_or_r == 'r'
         then suh * suh * suh
         else -1
 in
  k
 この例では、この関数の呼び出しの記述を、inの後のkで置き換える。kの値は、letの後の記述で設定される。
 そこでは、第2パラメーターがhだったらsuh*suhに設定。rだったらsuh*suh*suhに設定。それ以外だったら-1をエラー値として設定。そのkに、この関数の呼び出しの記述は置き換えられる。

 関数の定義が、do形式で記述されている時は、末尾には、IO()型を返す記述を書く。
 この場合には、関数の呼び出しの記述は、最終的には、末尾の記述の処理が実行された上で、IO()に置き換えられる。
 ただし、その前に、その記述に至るまでに記述されている処理が実行される。
例、
put_heihouOrRippou suh = do
 str <- getLine
 let
  k = if str == "h"
     then suh * suh
     else if str == "r"
         then suh * suh * suh
         else -1
 if k == -1 then putStrLn "Error !!"
       else putStrLn $ show k
 putStrLn "put_heihouOrRippou Shuhryou !!"
 この例では、まず、画面から、Enterキーをタイプ入力するまでの文字列を読み込む。
 その文字列がhなら、kにsuh*suhを設定。
 rなら、suh*suh*suhをkに設定。
 それ以外の文字列なら、kに-1をエラー値として設定している。
 そして、kがエラー値の-1だったら、画面に、Error !!と出力する。
 それ以外の値だったら、画面に、そのkの値を出力する。
 さらに、put_heihouOrRippou Shuhryou !!を画面に出力する。
 そして、doブロックの最後のputStrLnの返り値のIO()に、この関数の呼び出しの記述を置き換える。
 以上が、この関数である。
 なお、doブロックの中のletは、返り値がIO()型やIO String型などではない式を記述するブロックの前に置く。
 そして、letよりも字下げをした上で、返り値がIO()ではない式を記述する。
 なお、返り値がIO()型やIO String型などの式は、letと先頭を揃えて記述する。
 つまり、上記の例の通りである。

 関数の定義が、let-in形式でもなく、do形式でもなく、記述されている時は、関数の呼び出しの記述が、let-in形式でもなくdo形式でもなく記述されているものに置き換えられる。
例、
kansuh suh ruijoh = suh ^ ruijou
 この例では、この関数の呼び出しの記述が、suh^ruijou、に置き換えられる。

 以上が、関数の定義の記述の基本的な3形式である。
 さらに、それぞれの形式で、where節を追加した記述形式もある。
 where節の中では、let-in形式やdo形式やそれ以外の形式の中で使われている各値を確定するための記述、を行う・が行える。
例、
put_heihouOrRippou suh = do
 str <- getLine
 let
  k = if str == "h"
     then heihousuh
     else if str == "r"
         then rippousuh
         else -1
 if k == -1 then putStrLn "Error !!"
       else putStrLn $ show k
 putStrLn "put_heihouOrRippou Shuhryou !!"
  where
   heihousuh = suh * suh
   rippousuh = suh * suh * suh
 この例は、2つ前の例と同じことを行っている。
 ただし、if文の中に、suh*suhを直接、記述せずに、where節の中で、それをheihousuhに代入している。
 また、suh*suh*suhもwhere節の中で、rippousuhに代入している。
 そして、suh*suhの代わりにheihousuhを、suh*suh*suhの代わりにrippousuhを使用して記述してある。

 以上で、基本的な3形式の記述の仕方のポイントを理解してもらえただろうか。