4 ms·
Implementing a monad is only 30% of the deal. Being able to abstract over monads (and other type constructors) ... that's the part that really matters. C# is
by airless_bar 11y ago
Implementing a monad is only 30% of the deal.
Being able to abstract over monads (and other type constructors) ... that's the part that really matters.
C# is not expressive enough for that.
- louthy 11y agoIt doesn't do higher-kinded polymorphism, no. If you're referring to something else, please elaborate on what it can't express. But for the example given in the blog piece it's exactly as expressive and concise - so it's not giving C# a fair hearing. It is actually possible to get most of the way to HKT using extension methods. But it involves a hell of a lot of typing. In my project I used a template generator to do it. It's still pretty limited though, and there isn't a single type-class called Monad.
- airless_bar 11y ago> It doesn't do higher-kinded polymorphism, no. That's what I referred to. > ... The point is that you can't leverage all the existing monad/functor/applicative/free/yoneda... libraries out there–they don't exist, because they can't be written in a way that would allow re-use.
- louthy 11y ago> all the existing monad/functor/applicative/free/yoneda... libraries out there–they don't exist Agreed. I can only hope one day that the CLR team decide it's a reasonable thing to support so that C# (and F#) can both support it. It seems to be the blockage to the language teams (they won't move without it, even if they could implement it in a weaker/slower way on top of the existing type system). I've jumped through many hoops to get as much of a functional 'base class library' as possible in C# (I needed it for a very large C# project I maintain and want to bring more stability to), but language support would be preferred.
- daxfohl 11y agoJust out of curiosity what kind of reusable monad libraries are out there for Scala/Haskell? Given the scope of everything between Maybe and IO, I've never understood what one could make that would be useful to "monads" in general (beyond the sugar for do-notation).
- runT1ME 11y agohttps://github.com/scalaz/scalaz https://github.com/scalaz/scalaz Monad Transformers for one. Traverse/Sequence are another super common (amazing) pattern that requires abstracting over types. http://eed3si9n.com/learning-scalaz-day12 http://eed3si9n.com/learning-scalaz-day12 is a nice tutorial series on it.
- louthy 11y agoMonad transformers in C# [1] (but yes, only works with the monads in the library) [1] https://github.com/louthy/language-ext/blob/master/LanguageExt.Tests/OptionTTests.cs https://github.com/louthy/language-ext/blob/master/LanguageE...
- daxfohl 11y agoAh, light bulb moment (perhaps). So in F# I've been using specialized asyncSeq and asyncMaybe libraries. With monad transformers (and thus HKT's), would those come largely for free? And you could traverse a list<maybe<list<_>> combo like [Some [Some [1; 2]; None; Some [3]]; None; Some [None; Some [4]]] with no more difficulty than a regular list-of-lists?
- runT1ME 11y agoExactly! You can also write a generic "sequence" over a list, for instance, so that any 'monad' (task/future, maybe/option, state, either/disjunction etc.) can 'swap places'. So your List<Future<A>> can become Future<List<A>>. But you only need to write it once. Then it doesn't matter what the inner type of the List is, as long as it's a monad (applicative, really, but all monads are applicatives).