Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Feb 01 10:11
    @SystemFw banned @Hudsone_gitlab
  • Jan 31 2019 04:19
    404- forked
    404-/fs2
  • Jan 31 2019 03:01
    SethTisue commented #1232
  • Jan 30 2019 17:22
  • Jan 30 2019 13:45
  • Jan 30 2019 10:48
    pchlupacek commented #1406
  • Jan 30 2019 10:47
    pchlupacek commented #1406
  • Jan 30 2019 10:39
    pchlupacek commented #1407
  • Jan 30 2019 09:58
    lJoublanc commented #870
  • Jan 30 2019 09:42
    vladimir-popov commented #1407
  • Jan 30 2019 08:10
    vladimir-popov closed #1407
  • Jan 30 2019 08:10
    vladimir-popov commented #1407
  • Jan 29 2019 19:20
    SystemFw commented #1407
  • Jan 29 2019 19:20
    SystemFw commented #1407
  • Jan 29 2019 18:57
    SystemFw commented #1406
  • Jan 29 2019 17:47
    pchlupacek commented #1406
  • Jan 29 2019 17:42
    pchlupacek commented #1406
  • Jan 29 2019 17:39
    pchlupacek commented #1407
  • Jan 29 2019 17:39
    vladimir-popov edited #1407
  • Jan 29 2019 17:38
    vladimir-popov commented #1406
Christopher Davenport
@ChristopherDavenport
Also you don't have to reinvent the entire wheel up to whatever you need.
Like Rob had to basically subsume a good chunk of cats-effect to make ConnectionIO work.
Adam Rosien
@arosien
it's an implementation of separating program from implementation, so in that sense it is important and useful. tagless final is a cheaper encoding, for some dimensions of cost
Fabio Labella
@SystemFw
@glammr1 is worth learning the general concept behind both free and final tagless because they are both more general than free or final tagless
Adam Rosien
@arosien
caller chooses the effect constraint in tagless-final (F has to be a Monad, etc.), vs. the caller acts on Free
Fabio Labella
@SystemFw
for example, implementing new complex types is better done with initial encodings (free-like)
case in point: Stream and IO
whereas application abstraction in terms of commands/interfaces is nicer in final tagless
Adam Rosien
@arosien
method of tagless final algebra =~ data type representing that method coupled with Free
Bob Glamm
@glammr1
I seem to have this vague recollection that recursion schemes & free algebras are closely related and that's the piece I'm really curious about
Fabio Labella
@SystemFw
yeah, you need Fix to start talking about cata
and Fix is half of Free (the join part of Monad, without pure)
Christopher Davenport
@ChristopherDavenport
trait StateFinal[F[_], S]{
  def modify[A](f: S => (S, A)): F[A]
}
implicit def instance[S]: StateFinal[State[S, *], S] = new StateFinal[State[S, *], S]{
    def modify[A](f: S => (S, A)): State[S, A] = State(f)
  }
Always my favorite pairing for example purposes.
Bob Glamm
@glammr1
That was my biggest stumbling block with TaPL (and still is), the notion of Fix
Fabio Labella
@SystemFw
actually initial encodings help you understand those things a lot better
for example the difference between Monad and Applicative (or Command) is literally under your eyes with free constructions
since you have a data type that you can visualise
iirc fix in TaPL is used in a different context but I don't have it at hand to check
but generally when you hear about fix in the context of language design is for languages with no general recursion, and fix enriches them with it
it's the same idea ofc
basically the minimum thing that gives "recursivity" to something
Adam Rosien
@arosien
@glammr1 my brain forgets why it's called Fix, but i usually don't care because i can view it as a trick to make the type signatures work out
Fabio Labella
@SystemFw
fix point combinator
Bob Glamm
@glammr1
that's right, lambda calculus doesn't have built-in recursion hence the need for fix
Fabio Labella
@SystemFw
untyped lambda calculus actually can express recursion
it's Turing complete
you need the Y combinator (which is also related to finding a fix point), but you can
Bob Glamm
@glammr1
was it just typed lambda calculus that needed fix? Or am I way off base here?
Fabio Labella
@SystemFw
when you add types and you get to the simply typed lambda calculus, and then to System F, and then to SystemFw, they are all incapable of expressing recursion
and they need enrichment with fix
Adam Rosien
@arosien
do you mean fix, the function, or the type?
Fabio Labella
@SystemFw
so you're right there
the function in the latter half of this conversation
Adam Rosien
@arosien
ok thanks, that's what i thought, and i thought @glammr1 was talking about the type
Fabio Labella
@SystemFw
the type expresses the same idea in the metalanguage you are encoding your free construction in
Adam Rosien
@arosien
righto
Fabio Labella
@SystemFw
and btw it's easier to understand imho in the Free monad setting
Bob Glamm
@glammr1
Usually the examples for Fix I see in recursion schemes with Free right now are (a) usually in Haskell and (b) look like "Step 1: Write Free. Step 2. ???Fix??? Step 3. Profit!"
but that's due to my knowledge gap around Fix
Fabio Labella
@SystemFw
try encoding a simple language with Put and Read constructors, without using Free
also feel free to PM me if you want to work through it
Bob Glamm
@glammr1
++, added it to my "todo" list for learning Fix. I'll PM you if I run out of resources/references to look through, thanks
Fabio Labella
@SystemFw
as with many complex concepts there are several ways to arrive at it, and understanding is gained by exploring several of them until somehow intuition forms
:+1:
also whilst you can do it in Scala, haskell is a bit clearer to quickly experiment with this kind of stuff
Bob Glamm
@glammr1
Unfortunately my Haskell knowledge is like my Spanish knowledge: read-only and incomplete :D
Fabio Labella
@SystemFw
read-only Haskell is still very useful btw
Bob Glamm
@glammr1
just enough to get by when I really have to :D
Agree, it just takes me time to sort out type name bindings vs. data name bindings
Adam Rosien
@arosien
i always go back to https://tpolecat.github.io/presentations/sw2016/slides.html#1 for free/cofree/fix