Ich würde gerne lernen, wie das Folgende punktefrei gemacht würde:
%Vor%Ich verstehe, dass es besser ist, es aus Gründen der besseren Lesbarkeit so zu schreiben, aber ich würde gerne mehr darüber lernen, wie ich Funktionen zusammenstellen kann. Ich habe mir den Kopf darüber gekratzt, wie ich das machen kann. Die gesamte (erweiterte?) Typ-Signatur ist
%Vor%Die Typensignatur der Komposition, die ich erreichen möchte, ist
%Vor%Ich schrieb das Folgende als Notizen in einer Bastard-Lambda-Form. Wenn es eine Möglichkeit gibt, das Problem mit dem Lambda-Kalkül etwas zu vereinfachen, wäre es großartig, wenn das auch erklärt werden könnte:
%Vor% Oben ist .
eine Anwendung, @
fängt ein (also ist f3 ein anderer Name für (Bool - & gt; Bool - & gt; Bool)).
Vielen Dank.
Edit: Ich weiß, dass dies nicht der optimalste oder wiederverwendbarste Code ist, und ich weiß, dass es in Punktfreiheit verwandelt wird, was es in Bezug auf Lesbarkeit usw. verschlechtert. Um zu klären, frage ich, wie ich es in Point-Free verwandeln kann weil ich mehr über Haskell und Komposition erfahren möchte .
Wenn ich einen Rundgang durch die ganze Frage mache, würde ich es wahrscheinlich so schreiben:
%Vor% Natürlich, das ist ein bisschen punting, denn dann würde man natürlich fragen, wie man inRange
punktfrei implementiert. Wenn Sie inRange
absolut nicht verwenden könnten, würde ich es auf diese Weise inline implementieren:
Dies verwendet die Leser-Anwendung, um zwei Funktionen mit einem einzigen Argument zu versorgen. liftA2
ist die angeforderte Kombinationsfunktion, allerdings mit umgelegten Argumenten:
Es gibt eine Klasse, die im Grunde für punktfreie Kompositionen † mit mehreren "Kanälen" bestimmt ist: Arrow
. Wenn Sie entschlossen sind, alles punktefrei zu machen, dann ist dies IMO der Weg zu gehen. Das hässliche bisschen daran ist, dass Sie ständig Funktionen uncurry müssen:
Wie das funktioniert, ist am besten mit einem Diagramm zu verstehen:
%Vor% † Arrow
funktioniert in einer verallgemeinerten Einstellung; nicht nur für Hask -Funktionen, sondern für jede geeignete Kategorie. Aber es ist nützlich genug, um es nur auf Funktionen anzuwenden.
Beachten Sie, dass x & lt; = 8 wenn und nur wenn 8-x & gt; = 0, so dass wir nur prelude verwenden können, können wir
schreiben %Vor% Grundsätzlich ordne ich einfach x
auf [x,x]
und dann auf [x,8-x]
und dann benötige ich beide gleichzeitig & gt; = 0.
Natürlich können Sie, wie in den Kommentaren angegeben, auch a,b
-Parameter angeben, um sie später wieder zu verwenden.
Hoffe, das hilft.
Tags und Links haskell lambda pointfree function-composition