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.