Haskell Funktion Zusammensetzung - (a - b) - (a - c) - (b - c - d) - (a - d)

7

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 .

Edit2: Eine wirklich gute SO-Antwort auf Punkt-frei

    
MIJOTHY 06.07.2016, 07:02
quelle

4 Antworten

2

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:

%Vor%

Dies verwendet die Leser-Anwendung, um zwei Funktionen mit einem einzigen Argument zu versorgen. liftA2 ist die angeforderte Kombinationsfunktion, allerdings mit umgelegten Argumenten:

%Vor%     
Daniel Wagner 06.07.2016, 22:40
quelle
9

Sie können die Tatsache verwenden, dass die Funktion Applicative ist. und schreibe withinBounds auf diese Weise:

%Vor%

Oder so:

%Vor%

Sie können hier und Safareli 06.07.2016 07:22

quelle
9

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:

%Vor%

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.

    
leftaroundabout 06.07.2016 09:02
quelle
-2

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.

    
awllower 06.07.2016 09:03
quelle