2016-04-13 20 views
0

Ich habe einige Probleme beim Implementieren einer Funktion, die sich selbst mehrere Male aufrufen soll. Jedes Mal aktualisiert es seine Werte und verbessert seine Genauigkeit. Im Prozess ruft es auf andere Funktionen, aber ich weiß, es funktioniert up ‚bis:Haskell, rekursiver Aufruf, viele Argumente

Type = [Double] 
*All lists; including type: Same, but not predetermined length. 


f0 :: Double -> [[Double]] -> [Double] -> Type -> Type 

Typisches Beispiel für Funktionsaufruf:

f0 1.0 [[1.0, 0.5, 1.0], [1.0, -1.0, 1.0]] [1.0, 0.0] (initTypeLength 2) 

Was ich tun möchte:

f1 :: Int -> Double -> [[Double]] -> [Double] -> Type -> Type 

... wobei "Int" (i) eine Anzahl von Iterationen aufruft, wobei f0 rekursiv verwendet wird, wobei alle Parameter gleich bleiben, mit Ausnahme des Typs, der aktualisiert wird.

Unsicher, ob f0 relevant ist, aber im Falle:

f0 a (x:xs) (y:ys) type = f_other a xs ys 
         $ f_yet_another a x y type 

Was mich verwirrt ist, wo und wie die Argumente angegeben werden.

Also zusammenfassend: Alles hier ist statisch, außer der einen Liste; "Type", der bei jeder Iteration aktualisiert wird. Wie nenne ich das? Ich habe das Gefühl, dass es offensichtlich ist, aber ich kann es einfach nicht so verstehen, wie Haskell es versteht.

Antwort

2

Ich denke, was Sie wollen, ist dies:

f1 k a b c t = (iterate (f0 a b c) t) !! k 

jedoch Typ ist ein Schlüsselwort in Haskell, also seien Sie vorsichtig mit ihm als Variablenname verwendet wird.

auch, falls Sie neugierig sind, wie iterate Werke, hier ist eine Implementierung:

iterate :: (a -> a) -> a -> [a] 
iterate f x = x : iterate f (f x)