I wanted to say "THE pure function". Now I realize that "pure function" is 
ambiguous :)

On Wednesday, July 3, 2013 1:03:26 AM UTC+2, Dragan Djuric wrote:
>
> 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> 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> 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
>>>> 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
>>>> --- 
>>>> 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.
>>>>  
>>>>  
>>>>
>>>
>>>
>>>
>>> -- 
>>> 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