2014-07-22 24 views
5

Załóżmy, że mam funkcję move.Skład funkcji dynamicznie

Teraz, w zależności od niektórych danych wejściowych (powiedzmy, że dane wejściowe mówią "Przenieś o 3"), muszę przenieść 3 razy.

zrobiłbym to tak:

move compose move compose move 

Czy można zrobić złożenie funkcji dynamicznie? Tak, że mogę zbudować moją nową funkcję w zależności od tego, ile razy muszę się ruszyć.

Dziękuję

+0

nie jest napisane, ale składa – ccheneson

+0

Zakładając 'move' wygląda mniej więcej tak' ruchu (Thing): Thing', jest to przykład endofunctor (funkcja z 'a -> a' dla jakiegoś" a "), który jest monoid pod skład funkcji i funkcji tożsamości. Jak pokazano w odpowiedziach, endofunktory mogą być tworzone tyle razy, ile jest to konieczne. W Haskell napisalibyśmy pożądaną funkcję jako '\ n -> mconcat (replicate n move)' – cdk

Odpowiedz

11

Można użyć metody Function.chain:

scala> val move1 = (x:Int) => x+1 
move1: Int => Int = <function1> 

scala> val move5 = Function.chain(List.fill(5)(move1)) 
move5: Int => Int = <function1> 

scala> move5(5) 
res1: Int = 10 
4

Wystarczy użyć owczarni

def move(x: Int): Int = x + 1 

def moveBy(n: Int) = 
    (1 to n).foldLeft[Int => Int](identity _) { (f, _) => f compose move } 

moveBy(5)(0) // > 5