The specific bind implementations always get the instance of the Monad 
protocol the bind was called with (since it is a part of an implementation 
of the Monad protocol), so you use that instance as a first argument to 
pure.

Of course, if you call bind with a function that does not make sense in a 
context, you'll get a runtime exception, like in the rest of Clojure. 
Clojure is not strongly typed, so it puts some expectations on the 
programmer. I am not trying to fix Clojure.

Thank you for some very thoughtful comments. If you are interested, we can 
try to write a bit more detailed comparisons of the approaches in both 
libraries.

On Wednesday, July 3, 2013 2:21:29 AM UTC+2, Ben wrote:
>
> On Tue, Jul 2, 2013 at 5:06 PM, Ben Wolfson <wol...@gmail.com<javascript:>
> > wrote:
>
>> On Tue, Jul 2, 2013 at 4:33 PM, Dragan Djuric <drag...@gmail.com<javascript:>
>> > wrote:
>>  
>>
>>> Regarding monadic laws, which one exactly demands that you cannot change 
>>> the monad (not counting the fact that haskell's implementation does it that 
>>> way)? Here are the laws, in Haskell:
>>>
>>> return a >>= k  =  k a
>>> m >>= return    =  m
>>> m >>= (\x -> k x >>= h)  =  (m >>= k) >>= h
>>>
>>> It seems to me the laws are still satisfied if you keep changing monads 
>>> in each bind (if compiler is not restricting it, as is the case with 
>>> Haskell but not with Clojure).
>>>
>>  
>> I suppose that may be right: you're supposed to verify that the laws 
>> obtain for a putative monad; they don't come for free just by calling 
>> something a monad. Allowing >>= to have the type m a -> (a -> n b) -> n b 
>> just means that you can't verify that yours obeys the laws. If you get to 
>> choose the type of "return", even the second one is up for grabs! It does 
>> seem somewhat odd to me to advertise the package as being familiar to 
>> Haskellers and to employ category-theoretic concepts and then to be so 
>> blasé about the definition of a monad. (I wonder if you can get away with 
>> this changing of type at all if you define bind in terms of fmap and join).
>>  
>
>
> How are you even supposed to implement bind, in fact? (Never mind 
> reasoning about what's going on in your program if you can't be certain 
> that the code won't switch out the monad you think you're working in, when 
> it does matter to you that you're in a specific one.) Generally for some 
> specific monad you need to do something specific with the return of f. For 
> instance, your seq-bind is implemented in terms of mapcat---meaning that 
> the f that's the second argument of mapcat had better return a seqable. 
> This doesn't work: (mapcat (comp atom inc) '(1 2 3)).
>
> -- 
> Ben Wolfson
> "Human kind has used its intelligence to vary the flavour of drinks, which 
> may be sweet, aromatic, fermented or spirit-based. ... Family and social 
> life also offer numerous other occasions to consume drinks for pleasure." 
> [Larousse, "Drink" entry]
>
> 

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to