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".
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.
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.
Im Folgenden werde ich die Probleme des Beispielprogramms auflisten, die ich persönlich empfunden habe.
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.
Wenn Sie beim Initialisieren eines Arrays einen Initialisierer verwenden, legen Sie die Anzahl der Elemente im Array fest.
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
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.
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.
Unten werde ich den C-Sprachcode veröffentlichen, den ich verbessert habe
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.
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;
}
}
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