[JAVA] Über die Erklärung zum Funktionstyp

zunaechst

Ich selbst interessiere mich für funktionale Sprachen und besuche verschiedene Websites Einige Websites beschreiben sorgfältig die Vorzüge funktionaler Sprachen und lassen Sie denken, dass "funktionale Sprachen gut sind", während andere sagen: "Nun, dies lässt Sie die Vorzüge funktionaler Sprachen nicht spüren." Was ich über diese Zeit schreiben möchte, sind die Merkmale "einer Website, auf der Sie die Vorzüge funktionaler Sprachen nicht spüren".

Spezifisches Site-Beispiel

Das Beispiel ist Code IQ Site. Der Zweck der obigen Site scheint zu sein, dass die Verarbeitung des Arrays in der Befehlstypsprache (C-Sprache) und der Funktionstypsprache (Haskell) geschrieben ist und die Funktionstypsprache (Haskell) durch Vergleichen der beiden leicht zu verstehen ist.

Was ist los

Ich stimme aufrichtig zu, dass die Beschreibung der funktionalen Sprache (Haskell) sehr präzise ist, aber ich persönlich denke, dass es einige Probleme mit der Logik der C-Sprache gibt, die als Beispiel für die imperative Sprache angegeben wird. .. Ich bin mir also nicht sicher, ob das, was angeblich der Nutzen der letzten funktionalen Sprache (Haskell) auf der Website ist, wirklich Vorteile bringt. Wenn beispielsweise Reduzieren und Zuordnen, die als die Vorzüge der funktionalen Sprache auf dieser Site gelten, bei der Implementierung in der Unterrichtssprache nicht viel Zeit und Mühe kostet, kann nicht gesagt werden, dass es einen echten Vorteil gibt.

Probleme mit dem Beispielprogramm

Im Folgenden werde ich die Probleme des Beispielprogramms auflisten, die ich persönlich empfunden habe.

Problem 1 Ich weiß nicht, was der Variablenname bedeutet

Was bedeutet i oder N im Beispielprogramm wirklich? Ich wusste nicht, was die Variablennamen darstellen, also konnte ich nicht herausfinden, wofür die Logik war, indem ich einfach das Programm las. Zumindest sollte ich counter sein und N sollte ARRAY_LIMITTED_NUMBER sein, um die Rolle der Variablen zu verdeutlichen.

Problem 2 Die Methode zum Deklarieren eines Arrays hat sich geändert.

Wenn Sie beim Initialisieren eines Arrays einen Initialisierer verwenden, legen Sie die Anzahl der Elemente im Array fest.

Problem 3 Der Zugriff auf das Array ist seltsam

Es kann einige Missverständnisse geben, wenn es um Fremdheit geht, aber ist es nicht einfacher, den Prozess zu schreiben, indem Zeiger anstelle von Indizes verwendet werden, um auf Arrays zuzugreifen? Wenn Sie mit einem Zeiger darauf zugreifen, sollte zumindest die Variable i nicht erforderlich sein

Problem 3 Array-Datenstruktur

Ist das nicht besser als ein Problem? Es ist ein Vorschlag. Es scheint besser, NULL einzuführen, um das Ende des Arrays darzustellen Auf diese Weise müssen Sie den Index nicht mit der maximalen Anzahl von Elementen im Array vergleichen, wenn Sie die Schleifenausgangsbedingung bestimmen. In diesem Fall gibt es ein Problem, was zu tun ist, wenn NULL in die Mitte des Arrays eingefügt wird. Solange Sie jedoch die Sprache C verwenden, müssen Sie einige Regeln für das Ende des Arrays festlegen. Das Beispielprogramm verwendet außerdem define, um die maximale Anzahl von Elementen im Array heimlich als 5 zu definieren.

Problem 4 In Bezug auf den Punkt, an dem Datenverarbeitung und Datensteuerung gemischt sind

Im ursprünglichen Programm werden Datensteuerung (Schleifenverarbeitung) und Datenverarbeitung (Schlangen- und Froschsimulation) an einem Ort durchgeführt. Aber steht das nicht im Widerspruch zu der strukturierten Programmierung, die seit Jahrzehnten vor funktionalen Sprachen gesagt wurde? Wenn Sie eine moderne Entwicklung durchführen, sollten Datensteuerung und Datenverarbeitung unabhängig von der verwendeten Sprache in separate Funktionen unterteilt werden.

Spezifische C-Sprachquelle

Unten werde ich den C-Sprachcode veröffentlichen, den ich verbessert habe

Verbesserte Quelle

sample.c


#include "stdafx.h"

//Berechnen Sie die Anzahl der überlebenden Frösche
int calc(int snakes, int flogs) {
	if (flogs >= snakes) return flogs - snakes;
	else return 0;
}

//Eine Funktion, die eine Reihe von Fröschen und Schlangen manipuliert
int execute(int snakes[], int flogs[]) {
	int survivors = 0; //Gesamtzahl der überlebenden Frösche
	while (true) {
		//Verlassen Sie die Schleife, wenn Sie das Ende des Arrays erreichen
		if (*snakes == NULL) break;
		survivors += calc(*snakes++, *flogs++);
	}
	return survivors;
}

int main()
{
	int snakes[] = { 5,4,3,2,1,NULL };//Schlange
	int flogs[] = { 7,6,1,2,2 ,NULL };//Frosch
	printf("Anzahl der überlebenden Frösche%5d", execute(snakes, flogs));
	getchar();
	return 0;
}

Mithilfe der Prototypdeklaration konnten wir auch das Verhalten funktionaler Sprachen reduzieren und kartieren.

Verbesserte Quelle (Karte, Version reduzieren)

sample.c


#include "stdafx.h"
typedef int(*FUNCPTR)(int a, int b);

//Eine Funktion, die eine Reihe von Fröschen und Schlangen manipuliert
//Übergeben Sie einen Funktionszeiger an FUNCPTR, der den Überlebenswettbewerb zwischen Fröschen und Schlangen simuliert.
int zip_and_reduce(int snakes[], int flogs[],FUNCPTR func) {
	int survivors = 0; //Gesamtzahl der überlebenden Frösche
	while (true) {
		//Verlassen Sie die Schleife, wenn NULL im Array angezeigt wird
		if (*snakes == NULL) break;
		survivors += func(*snakes++, *flogs++);
	}
	return survivors;
}

//Berechnen Sie die Anzahl der überlebenden Frösche
int calc(int snakes, int flogs) {
	if (flogs >= snakes) return flogs - snakes;
	else return 0;
}

//Berechnen Sie die Anzahl, wenn Frösche und Schlangen nebeneinander existieren
int calc_kyouzon(int snakes, int flogs) {
	return flogs + snakes;
}

int main()
{
	int snakes[] = { 5,4,3,2,1,NULL };//Schlange
	int flogs[] = { 7,6,1,2,2 ,NULL };//Frosch
	printf("Anzahl der überlebenden Frösche%5d", zip_and_reduce(snakes, flogs,&calc));
	printf("Nummer, wenn Schlange und Frosch nebeneinander existieren%5d", zip_and_reduce(snakes, flogs, &calc_kyouzon));
	getchar();
	return 0;
}

Ich werde auch die in Java implementierte Ver veröffentlichen.

sample.java


package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class MyTest {
    public static void main(String args[]){
		List<Integer>snakes = new ArrayList<Integer>();
		Collections.addAll(snakes, 1,2,3,20);
		List<Integer>flogs = new ArrayList<Integer>();
		Collections.addAll(flogs, 10,2,3,4,5);
		System.out.println(execute(snakes,flogs));
	}
	//Funktionen, die nach außen ausgesetzt sind
	//Übergeben Sie die Argumente für Schlange und Frosch als Argumente
	public static int execute(List<Integer>snaeks,List<Integer>flogs){
		//Der erste Gesamtwert ist 0
		return execute(snaeks.iterator(),flogs.iterator() ,0);
	}
    //Intern verwendete Funktionen
	//Iterator<Integer>snakes :Aufzählungstyp der Schlangen
	//Iterator<Integer> :Flogs Aufzählungstyp
	//sum :Gesamtwert der Flogs
	private static int execute(Iterator<Integer>snakes,Iterator<Integer>flogs ,int sum){
		//Wenn es keine Schlangen oder Frösche gibt, ist der Vorgang abgeschlossen
		if(!snakes.hasNext() && !flogs.hasNext())return sum;
		//Setzen Sie die Verarbeitung fort, wenn entweder Schlange oder Frosch vorhanden sind
		else return execute(snakes,flogs,sum + calc(ifExists(snakes),ifExists(flogs) ) );
	}	
	//Finde die Anzahl der Frösche
	//Gibt die Anzahl der Frösche abzüglich der Anzahl der Schlangen zurück, wenn mehr Frösche als Schlangen vorhanden sind
	//int snakes: Anzahl der Schlangen
	//int flogs: Anzahl der Frösche
	private static int calc(int snakes,int flogs){
		if(snakes<= flogs) return flogs - snakes;
		else return 0;
	}
    //Gibt das Element zurück, wenn der Enumerator eins hat, andernfalls wird 0 zurückgegeben
	private static int ifExists(Iterator<Integer>ite){
		if(ite.hasNext())return ite.next();
		else return 0;
	}
}

Am Ende

Wenn ich mir die verbesserte imperative Sprachquelle und die funktionale Sprachquelle anschaue, denke ich, dass jeder Mensch anders denkt. Ich bin nicht sehr gut in funktionalen Sprachen (Haskell),

Ich habe das Gefühl, dass es einen Verdienst gibt

Wie wäre es im Gegenteil mit der Erklärung, dass es praktisch ist, weil Sie Reduzieren und Zuordnen verwenden können? Ich denke

Recommended Posts

Über die Erklärung zum Funktionstyp
Über die Methode
Über das Paket
Ausgabe über die Methode, Teil 2
Informationen zur StringBuilder-Klasse
Kommentar: Über die Schnittstelle
Über die Asset-Pipeline
Über die Doppelfunktion -java
Über den ternären Operator
null gibt den Typ an
Über die Längenmethode
Informationen zum Kernel-Modul
Über die Kartenmethode
Über die Ahnenmethode
[Ausgabe] Informationen zur Datenbank
Informationen zur to_s-Methode.
Über den Umgang mit Null
Informationen zum Festlegen des JAXRS-Pfads
Probieren Sie den Funktionstyp in Java aus! ①
[Swift] Zusammenfassung über den Bool-Typ
Informationen zur Beschreibung von Docker-compose.yml
Ungefähr der gleiche und der gleiche Wert
Über den Android-Lebenszyklus
Über die Programmiersprache Crystal
Überlegungen zur Zeitmethode
Erläuterung zum Ruby String-Objekt
Über das Verhalten von Ruby Hash # ==
Über die Grundlagen der Android-Entwicklung
Informationen zu den Methoden equals () und hashcode ()
Über das Symbol <%%> in Rails erb
Erläuterung der Reihenfolge der Schienenrouten
Informationen zum Informationsaustausch-App-Band
Informationen zur aktuellen Entwicklungsumgebung (Java 8)
Lassen Sie uns den Array (Element) Typ verstehen!
Ein Murmeln über die Utility-Klasse
Informationen zur Rolle der Initialisierungsmethode
Denken Sie an die 7 Regeln von Optional
Erklärt Ruby Array-Objekte
Lassen Sie uns den optionalen (verpackten) Typ verstehen!
Informationen zur Protokollebene von java.util.logging.Logger