On 2013-12-04 08:24:02 +0000, qznc said:
On Wednesday, 4 December 2013 at 01:53:39 UTC, Shammah Chancellor wrote:
Or is D syntax not generic enough to define monads?
I started to port monads to D [0]. You can do it, but it looks ugly.
The trick is to implement (Haskell) type classes via template
specialization. I came to the conclusion that it is not worth it.
What D kind of lacks is a way to define a general type class aka the
interface. Of course, you could use the "interface" keyword, but then
you cannot apply it to structs. Haskell has no structs (value type
records), so they do not have this problem. Look at how isInputRange is
implemented [1]. The traits in Rust [2] provide this interface
mechanisms as a language feature. D uses static-if instead.
Not Haskell, not D, not Rust can check, if your monad actually follows
the monad laws [3]. This would probably require a full theorem prover
in your language. So Coq, Isabelle, and maybe ATS could do that. A
similar challenge would be to check if a user-defined plus operator is
commutative (a+b == b+a) like arithmetic plus operations.
[0]
https://bitbucket.org/qznc/d-monad/src/5b9d41c611093db74485b017a72473447f8d5595/generic.d?at=master
[1]
https://github.com/D-Programming-Language/phobos/blob/master/std/range.d#L519
[2] http://static.rust-lang.org/doc/0.8/tutorial.html#generics
[3] http://www.haskell.org/haskellwiki/Monad_laws
I was talking on the D newsgroup about using an interface type and
implementing isConceptOf!(<interface>) to be used with structs.
Wouldn't that fix the problem?
-Shammah