Entspricht der verschachtelten Schleife

7

Ich möchte eine Liste von Verkettungen in Haskell machen. Ich habe [1,2,3] und [4,5,6] und ich möchte [14,15,16,24,25,26,34,35,36] produzieren. Ich weiß, dass ich zipWith oder etw verwenden kann, aber wie soll ich das Äquivalent machen von: foreach in first_array    foreach in second_array

Ich denke, ich muss Karten- und Halbcurry-Funktionen verwenden, kann es aber nicht wirklich alleine machen: S

    
Machiaweliczny 03.06.2013, 19:31
quelle

6 Antworten

17

Sie könnten Listenverständnis dazu verwenden:

%Vor%

Tatsächlich ist dies eine direkte Übersetzung einer verschachtelten Schleife, da die erste der äußere / langsamere Index und die zweite der schnellere / innere Index ist.

    
Ziyao Wei 03.06.2013, 19:35
quelle
12

Sie können die Tatsache ausnutzen, dass Listen Monaden sind und die Do-Notation verwenden:

%Vor%

Sie können auch die Tatsache ausnutzen, dass Listen anwendbare Funktoren sind (vorausgesetzt, Sie haben Control.Applicative importiert):

%Vor%

Beide ergeben folgendes:

%Vor%     
Nikita Volkov 03.06.2013 19:37
quelle
5

Wenn Sie for in Ihrem Code wirklich sehen möchten, können Sie auch so etwas tun:

%Vor%

Sie können auch nach for und Identity für mehr idiomatischer Ansatz.

    
cheecheeo 03.06.2013 20:33
quelle
1

Verschachtelte Schleifen entsprechen verschachtelten Verwendungen von map oder ähnlichen Funktionen. Erste Annäherung:

%Vor%

Das gibt Ihnen verschachtelte Listen, die Sie auf zwei Arten eliminieren können. Eine besteht darin, die Funktion concat :: [[a]] -> [a] zu verwenden:

%Vor%

Eine andere Möglichkeit ist die Verwendung dieser integrierten Funktion:

%Vor%

Verwenden Sie das:

%Vor%

Andere Leute haben Listen-Comprehensions und die Listen-Monade erwähnt, aber diese gehen wirklich auf geschachtelte Verwendungen von concatMap zurück.

    
Luis Casillas 03.06.2013 21:09
quelle
1

Weil die do -Notation und das Listenverständnis schon gesagt wurden. Die einzige andere Option, die ich kenne, ist über den liftM2 -Kombinator von Control.Monad . Das ist genau dasselbe wie die vorherigen zwei.

%Vor%     
mhitza 04.06.2013 20:01
quelle
0

Die allgemeine Lösung der Verkettung zweier Listen von ganzen Zahlen ist dies:

%Vor%

Beispiel: concatInt [1,2,3] [4,5,6] == [14,15,16,24,25,26,34,35,36]

Komplexeres Beispiel: ConcatInt [0,2,10,1,100,200] [24,2,999,44,3] == [24,2,999,44,3,224,22,2999,244,23,1024,102,19999,144,103,14,12,12, 1999,144,13,10024,1002,100999,10044,1003,20024,200,2009999,20044,2003]

    
Alberto Capitani 04.06.2013 05:27
quelle

Tags und Links