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]
"Nie chcę używać LINQ". Czemu? Wymyślasz koło. –
Haskell nie ma funkcji "każdy" - w przykładzie użyto 'forM_'' 'forM_ str putStrLn' – Lee
' List 'ma również metodę' .foreach() ', w której można również użyć delegata ciągu znaków –
MethodMan