Wpis z mikrobloga

#programowanie #javascript #csharp

Czytam sobie ostatnio YDKJS i zainteresowały mnie domknięcia. Postanowiłem więc spróbować osiągnąć domknięcie w C#, na podobnej zasadzie jak robi się to w JS. Wytworzyłem sobie cuś takiego:

class Program
{
static void Main(string[] args)
{
Func> MultiplyBy = delegate (int x)
{
return delegate (int a) { return a * x; };
};

var multiply = MultiplyBy(10);

Console.WriteLine(multiply(5));
Console.ReadKey();
}
}

Wygląda na to że działa. Tylko czy jest to aby domknięcie czy jedynie symulacja podobnego zachowania? Było nie było, jest to obejście za pomocą funktorów bo w C# funkcja nie jest obiektem.
  • 8
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Mark9wi: Pobieżnie przeglądając wygląda mi na coś podobnego. Predykat też jest rodzajem funktora, tylko zwracającym zawsze boola. Generalnie bez użycia funktorów raczej nie da się tego zachowania osiągnąć.
  • Odpowiedz
@Khaine: To, co robisz, to częściowa aplikacja funkcji z wykorzystaniem domknięcia. Terminy do obczajenia : partial function application, ew. currying. A, i wygodniej w .NET będzie Ci to robić w F#.
  • Odpowiedz
@Czesiowcy: Ja tego nie robiłem po to aby tego używać, bo jak piszemy obiektowo - to piszmy obiektowo i nie mieszajmy paradygmatów. Potem by ktoś po mnie czytał i by się zastanawiał czy jestem aby normalny aby wymuszać takie funkcyjne abominacje żeby potem ktoś się zastanawiał co tu się odwala. Ot tak sprawdziłem jakby to wyglądało.

W JSie funkcja jest obiektem z natury, więc dużo wygodniej takie fikołki robić +
  • Odpowiedz
@Khaine: Przy obecnej ilości funkcyjnych ficzerów w C# zakładam w takim razie, że nie używacie lambd (a tam domknięć używa się dosyć naturalnie, zważywszy na to, że możesz wykorzystać zmienne spoza zakresu samej funkcji), właśnie domknięć, dopasowania do wzorca i jeszcze paru innych rzeczy, skoro piszecie obiektowo. Pomijając to, że częściowa aplikacja funkcji w C# nie jest żadną magią i jest bardzo wdzięcznym sposobem na bootstrapowanie aplikacji, jeśli nie chcesz
  • Odpowiedz
@Czesiowcy: Nie no, lambd się używa, ale nie tworzy się wiszących w powietrzu obiektów funktorów aby na siłę wymuszać obiektową naturę funkcji, bo kogoś boli zrobić klasę która ma pola i funkcję, która z nich korzysta. W lambdach to jest ukryte pod spodem, więc jest bardziej naturalne w odczuciu.
  • Odpowiedz
@Khaine: Ok, ale dobrałeś sobie język, który najczęściej średnio tego potrzebuje i średnio się do tego nadaje (mówię, od takich zabaw jest F# z jego potężną inferencją typów, pomijając to, że częściowa aplikacja funkcji ma swoje zastosowania i w C#). To tak, jakbyś próbował za czasów ES5 odtworzyć w C# tworzenie na samowykonującej się funkcji obiektów z hermetyzacją i publicznym API, bo JS w tych radosnych czasach nie przewidywał takich
  • Odpowiedz
@Czesiowcy: Jasne że tak. To był tylko eksperyment aby sprawdzić czy jestem w stanie takie samo zachowanie odwzorować w C#. Po co miałbym to robić to nadal nie wiem - no ale się da ( ͡º ͜ʖ͡º)
  • Odpowiedz