Verwendungen von Γ
Die Hauptanwendung der integrierten Funktion Γ
, die als Mustererkennung in Listen oder Listendekonstruktion bezeichnet wird , besteht darin, eine Liste in einen Kopf und einen Schwanz aufzuteilen und auf diese eine Binärfunktion anzuwenden. Dies entspricht der Haskell-Pattern-Matching-Sprache
f (x : xs) = <something>
f [] = <something else>
wo <something>
ein Ausdruck enthält x
, xs
und gegebenenfalls f
. Es gibt 4 Überladungen von Γ
, von denen jede ein wenig anders funktioniert.
list
Die erste Überladung list
nimmt einen Wert a
und eine Binärfunktion an f
. Es gibt eine neue Funktion zurück, die eine Liste aufnimmt, zurückgibt, a
wenn sie leer ist, und f
Kopf und Schwanz aufruft, wenn sie nicht leer ist. Nimmt zum Beispiel Γ_1€
eine Liste, gibt -1
sie zurück, wenn sie leer ist, und den Index des ersten Vorkommens des ersten Elements im Ende, wenn nicht.
listN
Die zweite Überladung listN
ähnelt list
, außer dass sie a
weggelassen wird und stattdessen der Standardwert des Rückgabetyps verwendet wird. Zum Beispiel Γ€
ist äquivalent zu Γ0€
, da der numerische Standardwert ist 0
.
In der Praxis listN
wird häufiger als verwendet list
, da der Standardwert entweder irrelevant oder genau das ist, was Sie benötigen. Ein übliches Muster ist Γ~αβγ
, wo αβγ
drei Funktionen sind; Dies gilt β
für das erste Element und γ
den Schwanz und kombiniert die Ergebnisse mit α
. Es wurde zB in dieser Antwort verwendet . Andere Muster umfassen das Γo:α
Anwenden α
nur auf das erste Element und das Γ·:mα
Anwenden α
auf alle Elemente mit Ausnahme des ersten. Letzteres wurde in dieser Antwort verwendet .
listF
Die dritte Überladung ist etwas aufwändiger. Wie list
es nimmt einen Wert a
und eine Funktion f
und gibt eine neue Funktion , g
die eine Liste nimmt. Dieses Mal f
wird jedoch ein zusätzliches Funktionsargument benötigt, das g
selbst angegeben ist und für jeden Wert aufgerufen werden kann (einschließlich, aber nicht beschränkt auf den Endpunkt der Eingabeliste). Dies bedeutet, dass listF
ein allgemeines Rekursionsschema für Listen implementiert wird .
listF
wird nicht sehr oft verwendet, da die explizite Rekursion mit list
/ listN
normalerweise genauso lang oder kürzer ist wie in dieser Antwort .
listNF
listNF
is to listF
what listN
is to list
: Die Eingabe a
wird weggelassen, und stattdessen wird der Standardwert des Rückgabetyps verwendet. In seltenen Fällen kann es kürzer als eine rechte Falte sein, zum Beispiel in dieser Antwort .
Als Beispiel für die rekursiven Versionen von mischt Γ
die Funktion Γλ·:o⁰↔
eine Liste in der Reihenfolge erster, letzter, zweiter, vorletzter, dritter, vorletzter und so weiter.
Probieren Sie es online!
Die Funktion f
ist das explizite Lambda λ·:o⁰↔
, dessen Argument ⁰
die gesamte Funktion ist. Was f
bedeutet, ist, den Schwanz umzukehren ↔
, dann die Hauptfunktion rekursiv mit aufzurufen o⁰
und schließlich den Kopf zurückzunageln ·:
. Γ·:o₀↔
Ist natürlich ein Byte kürzer, funktioniert aber nicht, wenn die Zeile etwas anderes als diese Funktion enthält.