pure function, defined in applicative, is equivalent to return (In Haskell, 
in Fluokitten there is only pure).

I think I understand what is your question now. Since Clojure does not 
support polymorphysm based on the returning argument you cannot translate 
that Haskell code exactly. For such a case (when you want to keep operating 
in the same monad without knowing which one it is), a you have to provide 
an argument for m in f (but that's how Clojure works :), and then apply it 
partially or curry it:

(defn f [m g] (comp (pure m) g g))

(def c+ (curry +))

(bind [1 2 3] (f [] (c+ 2))
or
(>>= [1 2 3] (f [] (c+ 2))

If [] really hurts your aesthetic views maybe a macro (bind* or mdo) would 
help, since instead of [], any vector, let's say [1 2 3] would do, but 
then, it's a special case when you actually want the monad to stay the same.

Thank you for helpful comments, BTW :)

On Wednesday, July 3, 2013 12:03:45 AM UTC+2, Ben wrote:
>
> e.g., I'm not sure how to define the function "f" here:
>
> $ ghci
> GHCi, version 7.4.1: http://www.haskell.org/ghc/  :? for help
> Loading package ghc-prim ... linking ... done.
> Loading package integer-gmp ... linking ... done.
> Loading package base ... linking ... done.
> Prelude> let f :: (Monad m) => (a -> a) -> a -> m a  ; f g  = return . g . 
> g
> Prelude> Just 4 >>= f (2+)
> Just 8
> Prelude> [[1]] >>= f (2:)
> [[2,2,1]]
> Prelude> import Control.Monad.State
> Prelude Control.Monad.State> runState (get >>= f (+4)) 4
> Loading package transformers-0.2.2.0 ... linking ... done.
> Loading package mtl-2.0.1.0 ... linking ... done.
> (12,4)
> Prelude Control.Monad.State> 
>
>
>
> On Tue, Jul 2, 2013 at 2:45 PM, Ben Wolfson <wol...@gmail.com<javascript:>
> > wrote:
>
>> I did look at the docs and I don't really get how to return a monadic 
>> value in the right monad, the way "return" does automatically. All the 
>> examples I saw have something like "vector" or "atom" or what-have-you.
>>
>>
>> On Tue, Jul 2, 2013 at 2:41 PM, Dragan Djuric <drag...@gmail.com<javascript:>
>> > wrote:
>>
>>> No, the second argument to bind only needs to be a function that takes a 
>>> plain value and return a monadic value; you do not need to specify anything 
>>> explicitly and it does not need to know what kind of monad it is operating 
>>> on. Whatever that function returns will be a monad that the eventual second 
>>> bind will operate on.
>>> Moreover, Fluokitten supports vararg bind, so the function is actually 
>>> the last argument of bind in general case; it is the second argument only 
>>> if there are two args.
>>>
>>> Please note that Fluokitten does not have a built-in mdo (a syntactic 
>>> sugar for nested binds) for now. The reason is that Clojure itself has 
>>> native constructs that do many stuff that Haskell's do does, so I am not 
>>> yet sure why and if it would be useful, and if I add it how to make it 
>>> non-awkward. Of course, I am open to suggestions.
>>> Also note that Fluokitten is not monad-centric, it has functors, 
>>> applicatives, etc and I plan to add more categorical concepts, so It is 
>>> different in that regard from other monadic Clojure libraries. That's why I 
>>> would like to suggest reading the docs, most of the stuff is significantly 
>>> different from other libs, and more similar (but simpler, due to the lack 
>>> of legacy) to Haskell's categorical stuff.
>>>
>>>
>>> On Tuesday, July 2, 2013 9:15:10 PM UTC+2, Ben wrote:
>>>
>>>> I haven't played around with this but it looks as if the second 
>>>> argument to bind needs to know what kind of monad it's operating in, is 
>>>> that right? Would it be possible to write agnostic functions like this in 
>>>> this lib?
>>>>
>>>> monads.core> (defn tst-reader [f]
>>>>                (mdo env <- ask
>>>>                     v <- (lift (f env))
>>>>                     (return (println "here I am"))
>>>>                     (return v)))
>>>> #'monads.core/tst-reader
>>>> monads.core> (require '[monads.reader :as r] '[monads.identity :as i] 
>>>> '[monads.state :as st] '[monads.error :as e])
>>>> nil
>>>> monads.core> (r/run-reader-t (r/t i/m) (tst-reader (comp return inc)) 5)
>>>> here I am
>>>> 6
>>>> monads.core> (r/run-reader-t (r/t e/m) (tst-reader (fn [_] (throw-error 
>>>> "early exit"))) 5)
>>>> #<Either [:left early exit]>
>>>> monads.core> (st/run-state (r/run-reader-t (r/t st/m) (tst-reader (fn 
>>>> [env] (>> (modify #(assoc % :env env)) (return (dec env))))) 5) {})
>>>> here I am
>>>> #<Pair [4 {:env 5}]>
>>>> monads.core> 
>>>>
>>>> ?
>>>>
>>>>
>>>> On Tue, Jul 2, 2013 at 11:07 AM, Dragan Djuric <drag...@gmail.com>wrote:
>>>>
>>>>> I am pleased to announce a first public release of new (and different) 
>>>>> "monads and friends" library for Clojure.
>>>>> Extensive *documentation* is at 
>>>>> http://fluokitten.**uncomplicate.org<http://fluokitten.uncomplicate.org>
>>>>>
>>>>> Fluokitten is a Clojure library that implements category theory 
>>>>> concepts, such as functors, applicative functors, monads, monoids etc. in 
>>>>> idiomatic Clojure.
>>>>>
>>>>> Main project goals are:
>>>>>
>>>>>    - Fit well into idiomatic Clojure - Clojure programmers should be 
>>>>>    able to use and understand Fluokitten like any regular Clojure library.
>>>>>    - Fit well into Haskell monadic types conventions - programmers 
>>>>>    should be able to reuse existing widespread monadic programming 
>>>>> know-how 
>>>>>    and easily translate it to Clojure code.
>>>>>    - Be reasonably easy to learn - the code from the existing books, 
>>>>>    articles and tutorials for learning monadic programming, which is 
>>>>> usually 
>>>>>    written in Haskell should be easily translatable to Clojure with 
>>>>> Fluokitten.
>>>>>    - Offer good performance.
>>>>>
>>>>> Please give us your feedback, and we would also love if anyone is 
>>>>> willing to help, regardless of previous experience, so please *get 
>>>>> involved*. There are lots of things to be improved:
>>>>>
>>>>>    - If you are a native English speaker, i would really appreciate 
>>>>>    if you can help with correcting the English on the Fluokitten site and 
>>>>> in 
>>>>>    the documentation.
>>>>>    - Contribute your example code (your own or the ports from Haskell 
>>>>>    tutorials) to be added to Fluokitten tests.
>>>>>    - Contribute articles and tutorials.
>>>>>    - Do code review of the Fluokitten code and suggest improvements.
>>>>>    - If you find bugs, report them via Fluokitten issue tracker.
>>>>>    - If you have any additional suggestion, contact us here: 
>>>>>    
>>>>> http://fluokitten.**uncomplicate.org/articles/**community.html<http://fluokitten.uncomplicate.org/articles/community.html>
>>>>>  
>>>>>
>>>>>  -- 
>>>>> -- 
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Clojure" group.
>>>>> To post to this group, send email to clo...@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+u...@**googlegroups.com
>>>>>
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/**group/clojure?hl=en<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+u...@**googlegroups.com.
>>>>>
>>>>> For more options, visit 
>>>>> https://groups.google.com/**groups/opt_out<https://groups.google.com/groups/opt_out>
>>>>> .
>>>>>  
>>>>>  
>>>>>
>>>>
>>>>
>>>>
>>>> -- 
>>>> 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 clo...@googlegroups.com<javascript:>
>>> Note that posts from new members are moderated - please be patient with 
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@googlegroups.com <javascript:>
>>> 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+u...@googlegroups.com <javascript:>.
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>  
>>>  
>>>
>>
>>
>>
>> -- 
>> 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]
>>
>>  
>
>
> -- 
> 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