Scala 関数型 の勉強をしてみた。
Scala言語と関数型の考え方の勉強をしてみた。
卒業論文・・・・・・。
一通り本で学んだのだが、まだ身についていない感じ。
やはりコードを書かないと。
複数の言語で関数型言語風の関数(メソッド)を書いてみた。
2つの引数の間の数を足し合わせる関数(メソッド)
入力例:3 10出力例:52
中身:3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 52
簡単ですね。
※
箇条書きの部分は思いつくままに書いたので、間違いや不公平な部分がある可能性がございます。
ご了承下さい。
Scala
object RoopTest { def main(args: Array[String]):Unit = { //手続き型 println(procedural(3,10)) //関数型 println(functional(3,10)) } def procedural(start:Int, end:Int):Int = { var result = 0; for(i <- start to end) { result += i; } return result } def functional(start:Int, end:Int):Int = { def localFunctional(result:Int, start:Int, end:Int):Int = { if(start > end) result else localFunctional(result+start,start+1, end); } localFunctional(0, start, end); } }
・型推論があるため、型の宣言を省略できる。
・関数の中に関数を定義できる。
・return文を省略できる。(最後に評価された値が返される。)
これらの機能のおかげで比較的見やすいコードになっているかと思います。
Java
public class RoopTest { public static void main(String args[]) { //手続き型 System.out.println(procedural(3,10)); //関数型 System.out.println(functional(3,10)); } public static int procedural(int start, int end) { int result = 0; for(int i = start; i <= end; i++) { result += i; } return result; } public static int functional(int start, int end) { int result = localFunctional(0, start, end); return result; } public static int localFunctional(int result, int start, int end) { if(start > end) return result; else return localFunctional(result+start, start+1, end); } }
・型の宣言が省略できない。
・関数の中に関数は定義できない。
・return文は省略できない。
こういう使い方にはあまり適していないようですね。
C
#include <stdio.h> int procedural(int, int); int functional(int, int); int localFunctional(int, int, int); int main(void) { //手続き型 printf("%d\n",procedural(3,10)); //関数型 printf("%d\n",functional(3,10)); } int procedural(int start, int end) { int result = 0; int i; for(i = start; i <= end; i++) { result += i; } return result; } int functional(int start, int end) { int result; result = localFunctional(0, start, end); return result; } int localFunctional(int result, int start, int end) { if(start > end) return result; else return localFunctional(result+start, start+1, end); }
・型の宣言が省略できない。
・関数の中に関数は定義できない。
・return文は省略できない。
・プロトタイプ宣言が必要。
こちらも関数型風の書き方にはあまり適していないようです。
python
def procedural(start, end): result = 0; for i in range(start,end+1): result = result + i; return result; def functional(start, end): def localFunctional(result, start, end): if(start > end): return result; else: return localFunctional(result+start,start+1, end); return localFunctional(0, start, end); print procedural(3,10); print functional(3,10);
・動的型付のため、型の宣言が省略できる。
・関数の中に関数を定義できる。
・return文は省略できない。
・プロトタイプ宣言ができない
メソッドの中にメソッドを定義できるので良い感じですね。
何よりスクリプト言語なので、短いのがGOODですね。
各言語で仕様が異なるから、頭の中パンクしてきたぞー。