2014-10-17 18 views
5

Przenoszę funkcję Haskella/LiveScript each do C# i mam pewne problemy. Podpis tej funkcji to (a → Undefined) → [a] → [a] i pracuję bardzo dobrze z wpisywaniem i wyrażeniami lambda w Haskell lub LS, ale C# sprawia, że ​​jestem zdezorientowany. Ostateczne wykorzystanie tej metody rozszerzenie powinno być:Mieszanie metod rozszerzeń, generycznych i wyrażeń lambda

String[] str = { "Haskell", "Scheme", "Perl", "Clojure", "LiveScript", "Erlang" }; 
str.Each((x) => Console.WriteLine(x)); 

I, z tym, moje wyjście powinno być:

Haskell 
Scheme 
Perl 
Clojure 
LiveScript 
Erlang 

Mój obecny własna implementacja each jest:

public static void Each<T>(this IEnumberable<T> list, Action closure) 
{ 
    foreach (var result in list) 
    { 
    Delegate d = closure; 
    object[] parameters = { result }; 
    d.DynamicInvoke(parameters); 
    } 
} 

Problem polega na tym, że tutaj po prostu nie mogę przekazać parametru w moim wyrażeniu lambda. Nie mogę wykonać (x) => ....

Jak przekazać parametry do wyrażenia lambda? Praca z funkcjami pierwszej klasy w Haskell była łatwiejsza niż w C#. Jestem po prostu bardzo zdezorientowany.

Dla tych, którzy nie znają implementacji Each, jest używana dla efektów ubocznych, zwraca własną listę i stosuje iterację zamknięcia i przekazywanie każdej wartości listy jako argumentu. Jego wdrożenie w PHP powinno być:

public static function each($func) { 
    // where $this->value is a list 
    foreach ($this->value as $xs) { 
    $func($xs); 
    } 
    return $this->value; 
    // Or return $this; in case of method-chaining 
} 

Czy ktoś może mi pomóc? Szukałem tego, ale nie jest dla mnie jasne. [A ja nie chcę używać Linq]

+2

"Nie chcę używać LINQ". Czemu? Wymyślasz koło. –

+1

Haskell nie ma funkcji "każdy" - w przykładzie użyto 'forM_'' 'forM_ str putStrLn' – Lee

+1

' List 'ma również metodę' .foreach() ', w której można również użyć delegata ciągu znaków – MethodMan

Odpowiedz

10

Potrzebujesz Action<T> zamiast Action. Możesz także wywołać go bezpośrednio, zamiast używać DynamicInvoke:

public static void Each<T>(this IEnumberable<T> list, Action<T> a) 
{ 
    foreach (var result in list) 
    { 
    a(result); 
    } 
} 
Powiązane problemy