Met de komst van function delegates is het mogelijk om bepaalde concepten uit functionele programmeertalen als Haskell toe te passen in C#. Populaire blogonderwerpen zijn function memoization, currying en partial function application en monads.
Nu vind ik dit allemaal enorm interessant en ik heb daarom al flink wat van deze blogposts gelezen. Ook heb ik mijn Haskell-kennis afgestoft en aan de hand van een gratis boek wat oefeningen gedaan om weer wat feeling te krijgen met functioneel programmeren. Het begint allemaal enigzins te dagen (al vind ik het concept monad nog erg wazig), maar ik vraag mij toch wel af wat het nut van deze concepten is in mijn alledaagse programmeerwerk.
Er komen natuurlijk voorbeelden voorbij in blogs, maar de meeste zijn niet erg nuttig. Zo geloof ik inderdaad wel dat je door middel van currying een optelfunctie zoals hieronder kunt uitvoeren, maar dit heeft volgens mij weinig voordelen ten opzichte van een add functie met twee parameters.
Function memoization lijkt mij persoonlijk handig in het geval van recursie, zoals het fibonacci-voorbeeld in deze post. Zo zijn er waarschijnlijk meer toepassingen waarin het vasthouden van het resultaat van een functie voor een bepaalde set parameters een performancewinst kan opleveren, al zou je dit natuurlijk ook buiten de functie kunnen cachen.
Over monads durf ik nog niet veel te zeggen, aangezien ik die zelf nog niet goed doorgrond en het nut dan lastig te bepalen is. Wel begreep ik dat IEnumerable<T> in .NET een voorbeeld is van een monad en dat ik er dus nu al voordeel van heb. Graag zou ik wat meer te weten komen over het herkennen van monads en situaties waarin ik een monad zou kunnen toepassen.
Mijn vraag aan jullie: gebruiken jullie deze concepten nu in je allerdaagse programmeerwerk? En zo ja: heb je een goed voorbeeld waarin dit een significant voordeel biedt ten opzichte van een 'klassieke' C# oplossing?
Graag word ik overtuigd zodat ik deze sjeike functies aan een standaard set van extensions methods kan toevoegen.
Nu vind ik dit allemaal enorm interessant en ik heb daarom al flink wat van deze blogposts gelezen. Ook heb ik mijn Haskell-kennis afgestoft en aan de hand van een gratis boek wat oefeningen gedaan om weer wat feeling te krijgen met functioneel programmeren. Het begint allemaal enigzins te dagen (al vind ik het concept monad nog erg wazig), maar ik vraag mij toch wel af wat het nut van deze concepten is in mijn alledaagse programmeerwerk.
Er komen natuurlijk voorbeelden voorbij in blogs, maar de meeste zijn niet erg nuttig. Zo geloof ik inderdaad wel dat je door middel van currying een optelfunctie zoals hieronder kunt uitvoeren, maar dit heeft volgens mij weinig voordelen ten opzichte van een add functie met twee parameters.
C#:
1
2
3
4
5
6
7
8
9
| public static Func<A, Func<B, R>> Curry<A, B, R>(this Func<A, B, R> f) { return a => b => f(a, b); } Func<int,int,int> add = (x,y) => x + y; Func<int,Func<int,int>> curriedAdd = add.Curry(); int i = curriedAdd(3)(5) |
Function memoization lijkt mij persoonlijk handig in het geval van recursie, zoals het fibonacci-voorbeeld in deze post. Zo zijn er waarschijnlijk meer toepassingen waarin het vasthouden van het resultaat van een functie voor een bepaalde set parameters een performancewinst kan opleveren, al zou je dit natuurlijk ook buiten de functie kunnen cachen.
Over monads durf ik nog niet veel te zeggen, aangezien ik die zelf nog niet goed doorgrond en het nut dan lastig te bepalen is. Wel begreep ik dat IEnumerable<T> in .NET een voorbeeld is van een monad en dat ik er dus nu al voordeel van heb. Graag zou ik wat meer te weten komen over het herkennen van monads en situaties waarin ik een monad zou kunnen toepassen.
Mijn vraag aan jullie: gebruiken jullie deze concepten nu in je allerdaagse programmeerwerk? En zo ja: heb je een goed voorbeeld waarin dit een significant voordeel biedt ten opzichte van een 'klassieke' C# oplossing?
Graag word ik overtuigd zodat ik deze sjeike functies aan een standaard set van extensions methods kan toevoegen.
