2

Ich habe eine Hausaufgabe auf höherer Ordnung Funktionen in Haskell und ich habe ein wenig Schwierigkeiten beim Einstieg.Haskell Higher Order Funktionen

Wenn ich Hilfe und Erklärung zur ersten Frage bekommen könnte, bin ich zuversichtlich, dass ich den Rest erledigen kann.

Mit Funktionen höherer Ordnung (map, fold oder filter) und ggf. Lambda-Ausdrücke, Schreibfunktionen f1 und f2 so dass f1 (f2 (*) [1,2,3,4]) 5 ~> [5,10,15,20]

f1 = 
f2 = 

Ich denke, ich habe Verwenden Sie eine teilweise angewendet map, so dass [1,2,3,4] wird [(*1),(*2),(*3),(*4)]?

+0

Ich würde sagen, Sie mit 'f1 gn = gn' und dann schreiben f2, so dass' f2 (+) [1..4] 5 = beginnen soll = [5,10,15,20] ' – Ingo

+1

Ja,' f2 = map' klingt nach einer guten Idee. – Bergi

Antwort

2

Ich denke, ich muss eine teilweise ausgewertete Karte verwenden, so dass [1,2,3,4] wird zu [* 1, * 2, * 3, * 4] ??

Ihre Intuition bringt Sie auf die Antwort näher, so ist das ein gutes Zeichen

Das heißt, der Ausdruck, den Sie gegeben sind, mit zu arbeiten ist wirklich seltsam

f1 (f2 (*) [1,2,3,4]) 5 

ich f1 schreiben würde und f2 wie folgt

let f1 = \xs n -> map (\f -> f n) xs 
    f2 = map 
in f1 (f2 (*) [1,2,3,4]) 5 
-- [5,10,15,20] 
+1

Wenn Sie Lust auf etwas haben wollen, 'f1 = flip (map. Flip ($))' :-D – Bergi

+1

Ihre Antwort erklärt nichts – luqui

0

Wenn Sie f2 = map nehmen, Sie immed erhalten iately mit dem ersten Schritt, den Sie habe kommen mit:

f2 (*) [1, 2, 3, 4] = 
map (*) [1, 2, 3, 4] = 
[(1 *), (2 *), (3 *), (4 *)] 

nun diese Liste der Multiplikator Funktionen gegeben, wir

f1 [g1, g2, ..., gn] x = 
[g1 x, g2 x, ..., gn x] 

müssen da dann können wir es auf f2 (*) [1..4] anwenden bekommen

f1 [(1 *), (2 *), (3 *), (4 *)] 5 = 
[1 * 5, 2 * 5, 3 * 5, 4 * 5] = 
[5, 10, 15, 20] 

das ist was du willst.

Wenn man sich f1 aussehen, sieht es fast wie ein map, mit Ausnahme der Argumente flip ped sind:

f1 = \gs x -> map h gs 

Jetzt müssen wir herausfinden, was h ist. h muss etwas sein, das eine Funktion wie (2 *) übernimmt und Ihnen das Ergebnis der Anwendung dieser Funktion auf 5 gibt; d.h. h = \g -> g 5.

es Putting alle zusammen, wir bekommen

let f2 = map 
    f1 = \gs x -> map (\g -> g x) gs 
in f1 (f2 (*) [1, 2, 3, 4]) 5 
Verwandte Themen