4 ms·
Eh, C# is good for the environment it lives in, but it's not without it's cruft. C#'s answer for all of its missing features seems to be a generic class. Don't
by MatthewPhillips 15y ago
Eh, C# is good for the environment it lives in, but it's not without it's cruft.
C#'s answer for all of its missing features seems to be a generic class. Don't have tuples? We'll give you Tuple<T>. Don't have inline functions? We'll give you Func<T>. It feels very tacked on (especially Func).
- anarchotroll 15y agoI also feel like "Funcs" are a work around. What I like the most about C# is the fact that it keeps evolving and incorporating new paradigms (closures, lambdas, LINQ, etc)
- hackinthebochs 15y agoFunc<T> is just the type signature they use for lambdas. The syntax allows fully inline functions now: () => { DoSomething(); } No return value needed (compiles down to an Action<T> I think)
- masklinn 15y ago> No return value needed (compiles down to an Action<T> I think) Which is an other crufty thing in C#: because Void/() is not a type (inherited from Java), it needs to have both `Func<Tn..., T>` and `Action<Tn...>` in order to handle functions-with-a-return-value and functions-without-a-return-value.
- hackinthebochs 15y agoThis is true, but its mostly transparent unless you're doing something particularly ugly.
- masklinn 15y agoLike trying to take one of these as parameter or return it?
- hackinthebochs 15y agoThis is a statically typed language mind you. If you're passing something around as values, you're gonna need to declare what its type is (of course there's type inference, but that just turns it into a totally different language)
- masklinn 15y ago> If you're passing something around as values, you're gonna need to declare what its type is I fail to see the relation this has with my issue.
- MatthewPhillips 15y agoCan't recursively call a lambda function, no thanks.
- icebraining 15y agohttps://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx https://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymou...
- chrisb 15y agoThere are two ways of recursively calling lambda functions, neither perfect, but both usable. Func<int,int> fib = null; fib = n => n > 1 ? fib(n - 1) + fib(n - 2) : n; Or write yourself a Y fixed-point combinator, described in http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous... delegate Func<A,R> Recursive<A,R>(Recursive<A,R> r); static Func<A, R> Y<A, R>(Func<Func<A, R>, Func<A, R>> f) { Recursive<A, R> rec = r => a => f(r(r))(a); return rec(rec); } used like this: Func<int,int> fib = Y<int,int>(f => n => n > 1 ? f(n - 1) + f(n - 2) : n); (I'm not advocating writing a fib function this way, but it's a useful example!)
- sofuture 15y agoYeah, C# tuples are a pretty glaring hack in an otherwise great, evolving language.
- eropple 15y agoLike other C# features and behaviors, I expect that, down the line, the language will pick up syntactic sugar to make the creation and usage of those tuples more straightforward (see delegates -> anonymous functions -> lambdas).
- manojlds 15y agoYeah and F# is the breeding ground for C# features
- fleitz 15y agoTry F# then, tuples, records, pattern matching, etc. It's essentially OCaml.net
- MatthewPhillips 15y agoHave used F# quite a bit. It's nice, the nicest ML I've used, but it has some cruft as well. It feels like 2 languages, really, the nice functional ML language, and then the C#-with-F#-syntax object oriented side. I wish they wouldn't have bothered with the latter.
- pjmlp 15y agoActually the OO side is quite similar to OO in OCaml, so I miss your C# remark there. For a language to be first class in .NET it needs to be able to do OO with the same semantics that the CLR has, otherwise you will have leaky abstractions all over the place.
- pjmlp 15y agoFunc<T> are part of expression trees. They are intended to manipulate the abstract syntax tree of lambda expressions. A bit like macros. You should only need to know about them if doing AST manipulations.