Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Can you implement the Read class in Clojure?

  class Read r where read :: String -> r
(Let's ignore parse errors for our purposes here)

Haskell supports return-type polymorphism. Clojure, being dynamically typed, cannot in general support this kind of overloading.



Good point, though Clojure's extensible reader takes care of most of the use for this.

I think it's a trade-off though. Can Haskell dispatch on a value rather than a type?


Note that this feature is far from being useful only for class Read.

The Monad class actually depends on it too:

  class Monad m where
    (>>=) :: m a -> (a -> m b) -> m b
    return :: a -> m a
The type of "return" can only be expressed with return-type polymorphism.

This means you cannot really implement Haskell-like monads with dynamic typing. You have to implement them in a less general way.

As for dispatching on runtime values, that is ordinary pattern matching:

  f (RuntimeValue1 x y) = ... case 1 ...
  f (RuntimeValue2 x y) = ... case 2 ...


>This means you cannot really implement Haskell-like monads with dynamic typing.

Ahh, yeah I've heard this before. It totally slipped my mind.

>As for dispatching on runtime values, that is ordinary pattern matching

Can you extend the patterns of a function at runtime (or even across modules)?


No, you can't write a function spread across modules depending on the value of its input, short of implementing a dispatch system.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: