読者です 読者をやめる 読者になる 読者になる

sonoshouのまじめなブログ

情報系大学生からのウェブ見習い人生の記録

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ですね。




各言語で仕様が異なるから、頭の中パンクしてきたぞー。