Hacker News new | ask | show | jobs
by quchen 4607 days ago
You can't have monads in Scheme due to the lack of a type system. What you can have are instances of monads, but the point of using the concept of a monad is to abstract over it, and to have functions that work with any possible instance.
4 comments

Functions that work on "any monad" in Scheme can accept the monad operations as an extra parameter. A macro can hide this, like

    (with-monad m
       (monad-operation data))
See https://github.com/clojure/algo.monads for an implementation of this in Clojure.
> You can't have monads in Scheme due to the lack of a type system.

You can have monads in almost any language. The lack of static typing means you don't have static type safety with them, but monads aren't any different than anything else in that regard.

> What you can have are instances of monads, but the point of using the concept of a monad is to abstract over it, and to have functions that work with any possible instance.

How does not having static typing prevent you from abstracting over monads? You can still write functions that work with any possible instance of a monad in languages without static typing.

> How does not having static typing prevent you from abstracting over monads?

They were probably talking about the way Haskell can figure out which monad you're in through type inference. As an example, `return :: a -> m a` dispatches on the type of the function's return value, which doesn't map cleanly to a dynamically typed implementation. You need to be explicit about the monad you're in if you don't have the compiler helping you out.

That's true (and, heck, its true even of many static languages that support monads; that feature of Haskell is due to its better-than-most type inference, not just having static typing), but I don't see how that limits the capacity for abstraction. Certainly, you may need an additional explicit parameter in some cases rather than effectively implicitly supplying information via type inference, but that doesn't change the level of abstraction.
http://www.pvk.ca/Blog/2013/09/19/all-you-need-is-call-slash...

Think again, Paul Khoung walks you through implementing some monads using call/cc

Genuinely wondering: does this provide type safety?
No, that would happily evaluate "(sequence_ ((display 'a) nothing))".