2022/10/28

2022-10-28 00:00:40 +0000ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2022-10-28 00:01:58 +0000nilradical(~nilradica@user/naso)
2022-10-28 00:02:41 +0000ChaiTRex(~ChaiTRex@user/chaitrex)
2022-10-28 00:02:50 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 00:03:02 +0000lisbeths(uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2022-10-28 00:03:07 +0000ubert1(~Thunderbi@178.165.186.249.wireless.dyn.drei.com)
2022-10-28 00:03:27 +0000ubert(~Thunderbi@178.165.169.91.wireless.dyn.drei.com) (Ping timeout: 260 seconds)
2022-10-28 00:03:27 +0000ubert1ubert
2022-10-28 00:03:54 +0000jpds1(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2022-10-28 00:05:16 +0000jpds1(~jpds@gateway/tor-sasl/jpds)
2022-10-28 00:05:39 +0000gurkenglas(~gurkengla@p548ac72e.dip0.t-ipconnect.de)
2022-10-28 00:06:25 +0000Midjak(~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
2022-10-28 00:06:38 +0000polo(~polo@user/polo) (Ping timeout: 276 seconds)
2022-10-28 00:06:44 +0000 <EvanR> one of the monad laws is μ∘Tμ = μ∘μT where wikipedia says the thing to the right is horizontal composition of natural transformations. But T is a functor. So does it mean upgrade T to a natural transformation in the dumbest most obvious way first?
2022-10-28 00:07:03 +0000ft(~ft@p3e9bc845.dip0.t-ipconnect.de) (Ping timeout: 272 seconds)
2022-10-28 00:08:09 +0000ft(~ft@p508dbd59.dip0.t-ipconnect.de)
2022-10-28 00:11:31 +0000polo(~polo@user/polo)
2022-10-28 00:11:54 +0000redmp(~redmp@mobile-166-170-43-64.mycingular.net)
2022-10-28 00:12:03 +0000 <monochrom> No. Instead, μT is shorthand for μ :: T a -> T (T a). It is a natural transformation from T to Compose T T.
2022-10-28 00:12:54 +0000 <monochrom> Wait, is μ retunr? is μ join?
2022-10-28 00:12:58 +0000 <EvanR> join
2022-10-28 00:13:10 +0000 <monochrom> Ah OK, I need a correction then.
2022-10-28 00:13:20 +0000 <geekosaur> looked more like a comonad to me…
2022-10-28 00:14:08 +0000jpds1(~jpds@gateway/tor-sasl/jpds) (Ping timeout: 258 seconds)
2022-10-28 00:14:15 +0000 <monochrom> μT is shorthand for μ :: T (T (T a)) -> T (T a). It is a natural transformation from TTT to TT.
2022-10-28 00:14:28 +0000 <EvanR> (either way I'm annoyed that the article is trying to pass this off as something else)
2022-10-28 00:14:31 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 258 seconds)
2022-10-28 00:14:41 +0000 <dolio> But which one?
2022-10-28 00:14:58 +0000 <dolio> The answer is, the one that isn't Tμ.
2022-10-28 00:15:20 +0000 <monochrom> heh yeah
2022-10-28 00:16:17 +0000 <monochrom> In Haskell you would write "join . fmap join = join . join", but this could be annoying in not explicating which join acts on which type, in particular how many T's.
2022-10-28 00:17:12 +0000 <monochrom> The mathematicians' favourite notation can be derived this way.
2022-10-28 00:17:14 +0000 <EvanR> nice use of overloading of μ there
2022-10-28 00:17:21 +0000 <EvanR> I am quite confused
2022-10-28 00:18:11 +0000 <monochrom> First we agree that mathematicians have a notation equivalent to Haskell's type application. The two are not very different, so I'll write in the Haskell notation.
2022-10-28 00:18:46 +0000 <monochrom> Given for example reverse :: [a] -> [a], we can write "reverse @ Int" for the [Int]->[Int] version.
2022-10-28 00:19:42 +0000 <EvanR> is horizontal composition going to be in at any point xD
2022-10-28 00:20:02 +0000 <EvanR> or is that a red herring
2022-10-28 00:20:39 +0000slack4673(~slack1256@191.125.99.208)
2022-10-28 00:22:25 +0000 <jackdk> Lens question: I have `list :: [A]`, `p :: Prism' A B` and `f :: B -> m C` for some monad `m`. I want to construct an `m [C]` that is built up by applying `f` to every `B` in `list` that can be found with `p`. The best I have is to `traverse f $ list ^.. folded . p`, but is there something better that I'm missing?
2022-10-28 00:22:31 +0000 <EvanR> ok natural transformations produce morphisms for each type, so I think I see where you're doing with that
2022-10-28 00:22:49 +0000 <monochrom> With this, the monad law can be written μ . (T . μ) = μ . (μ @ T a), to just explicate the type instantiation of one of the μ's.
2022-10-28 00:23:15 +0000 <EvanR> you just composed a functor with a natural transformation...
2022-10-28 00:23:31 +0000slack1256(~slack1256@186.11.17.82) (Ping timeout: 272 seconds)
2022-10-28 00:24:03 +0000 <monochrom> Actually μ . T . (μ @ a) = μ . (μ @ T a) so both sides end with some kind of @ to make my next sentence go nicer.
2022-10-28 00:24:25 +0000 <dolio> Category theorists use the functor's name for its map operation.
2022-10-28 00:24:46 +0000 <geekosaur> remember the Haskell version was `fmap ...`
2022-10-28 00:24:48 +0000 <EvanR> yeah I get that, but functors map morphisms not N.T.s
2022-10-28 00:24:53 +0000 <monochrom> Then we "eta-reduce" away the "a" on both sides. At this points mathematicians also notice that they can conflate "." with "@" with no loss of ambiguity.
2022-10-28 00:25:07 +0000 <dolio> Also, I think μT is equivalent to horizontal composition with the identity transformation from T to T.
2022-10-28 00:25:16 +0000 <geekosaur> "loss of ambiguity"?
2022-10-28 00:25:24 +0000 <EvanR> hence the "dumbest most obvious way"
2022-10-28 00:25:53 +0000 <monochrom> With "." and "@" unified, they replace both by juxtaposition, thus μ . Tμ = μ . μT
2022-10-28 00:26:01 +0000 <EvanR> oh, monochrom is using haskell, right
2022-10-28 00:26:05 +0000 <monochrom> Err loss of unambiguity! Heh.
2022-10-28 00:26:25 +0000 <monochrom> I was starting with Haskell then showed the transition to math notation.
2022-10-28 00:26:56 +0000 <monochrom> Lastly, horizontal composition of natural transformation is just Haskell composition of polymorphic functions.
2022-10-28 00:27:25 +0000 <monochrom> If you have "reverse . reverse" it's a horizontal composition of natural transformations.
2022-10-28 00:27:35 +0000 <dolio> No, that one's vertical.
2022-10-28 00:28:20 +0000 <monochrom> OK I had a typo. That ruined everything didn't it?
2022-10-28 00:28:24 +0000 <dolio> Horizontal is where you compose α with fmap β, and it doesn't matter which order.
2022-10-28 00:28:38 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 00:28:50 +0000 <monochrom> μ . (T μ) = μ . (μ @ T a) is the right starting point.
2022-10-28 00:30:10 +0000 <monochrom> It is also μ . (T (μ @ a)) = μ . (μ @ T a)
2022-10-28 00:30:47 +0000jpds1(~jpds@gateway/tor-sasl/jpds)
2022-10-28 00:31:09 +0000 <EvanR> the thing is, μ is something already, and it's not polymorphic, so what are you doing
2022-10-28 00:31:49 +0000hueso(~root@user/hueso) (Quit: No Ping reply in 180 seconds.)
2022-10-28 00:31:59 +0000 <EvanR> when reading the "math version" what does your polymorphism correspond to
2022-10-28 00:32:29 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 00:32:38 +0000 <monochrom> I don't understand those questions and I don't know how to answer them.
2022-10-28 00:32:42 +0000 <EvanR> μ : T² -> T
2022-10-28 00:32:49 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 00:33:06 +0000 <EvanR> T : C -> C
2022-10-28 00:33:09 +0000hueso(~root@user/hueso)
2022-10-28 00:33:28 +0000Batzy_Batzy
2022-10-28 00:33:28 +0000 <EvanR> so wtf is μT and Tμ xD
2022-10-28 00:33:59 +0000 <dolio> Natural transformations are families of arrows that commute with arrows.
2022-10-28 00:34:01 +0000 <geekosaur> are you missing that Haskell's Monad is specialized to Hask (to the extent that it's a category) but CT monads aren't?
2022-10-28 00:34:12 +0000mmhat(~mmh@p200300f1c730768bee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.7.1)
2022-10-28 00:34:15 +0000 <EvanR> (dolio says it's horizontal composition after upgrading T to a N.T., which is what I guessed originally)
2022-10-28 00:34:20 +0000 <monochrom> Tμ is fmap μ. μT is μ @ T a then eta away the "a".
2022-10-28 00:34:21 +0000 <dolio> Polymorphic definitions are families of arrows that commute with relations.
2022-10-28 00:35:26 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-10-28 00:35:26 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-10-28 00:35:26 +0000wroathe(~wroathe@user/wroathe)
2022-10-28 00:35:41 +0000mtjm(~mutantmel@2604:a880:2:d0::208b:d001) (Remote host closed the connection)
2022-10-28 00:36:11 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 244 seconds)
2022-10-28 00:36:27 +0000 <EvanR> geekosaur, no but now I'm wondering what difference that makes, which I'll have to come back to
2022-10-28 00:36:54 +0000mtjm(~mutantmel@2604:a880:2:d0::208b:d001)
2022-10-28 00:37:01 +0000 <geekosaur> I'm probably confused, but in CT terms the Haskell one isn't polymorphic
2022-10-28 00:37:05 +0000jpds1(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2022-10-28 00:37:13 +0000 <geekosaur> I think
2022-10-28 00:37:30 +0000 <monochrom> Sure. But if you s/polymorphic/natural tranformation/ then you get the CT one.
2022-10-28 00:37:36 +0000 <geekosaur> that said, when you wrote "μ : T² -> T", that looks to me polymorphic in T
2022-10-28 00:37:37 +0000caryhartline(~caryhartl@107.140.218.181) (Quit: caryhartline)
2022-10-28 00:38:12 +0000 <geekosaur> unless the uppercase means a specific type/NT?
2022-10-28 00:38:32 +0000jpds1(~jpds@gateway/tor-sasl/jpds)
2022-10-28 00:38:55 +0000 <EvanR> T is a constant xD
2022-10-28 00:38:56 +0000 <monochrom> No. Instead, where Haskell writes "foo :: F a -> G a", CT writes "foo :: F => G". Then you find yourself going out of your way to write pointfree at the type level.
2022-10-28 00:39:12 +0000 <EvanR> (functor)
2022-10-28 00:39:13 +0000 <monochrom> T is the functor being declared as a monad.
2022-10-28 00:39:41 +0000 <geekosaur> oh, but we're talking about join so the inner Functor must be the same as the outer?
2022-10-28 00:40:40 +0000 <EvanR> monads are endofunctors so were only dealing in 1 category at a time
2022-10-28 00:40:41 +0000 <monochrom> With join you have "T (T a) -> T a" but remember you have to write it pointfree i.e. without "a" so now you have to invent some kind of T².
2022-10-28 00:41:15 +0000 <EvanR> yeah T . T
2022-10-28 00:43:25 +0000jargon(~jargon@184.101.208.112)
2022-10-28 00:44:14 +0000 <EvanR> you're saying Tμ is fmap join, while T is defined to map morphisms in C, rather than natural transformations or the associated map that takes objects...
2022-10-28 00:45:03 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 00:45:06 +0000 <monochrom> "T" is fmap, more precisely fmap@T, when used in the context of "T <morphism here>"
2022-10-28 00:45:33 +0000 <EvanR> I get that fmap is involved, I'll do some more noodling with the definition of horizontal composition, and hopefully jackdk gets their lens question answered
2022-10-28 00:45:41 +0000 <monochrom> Yes, whereas Haskell writes "fmap @ Maybe", math writes "Maybe".
2022-10-28 00:47:49 +0000 <monochrom> μ is a natural transformation therefore is instantiatable to a morphism, in particular in this context μ@a.
2022-10-28 00:47:49 +0000 <EvanR> maybe the missing link here is how you're going from μ the N.T. to a morphism join in the category
2022-10-28 00:48:04 +0000 <EvanR> ooooh
2022-10-28 00:48:13 +0000 <EvanR> that's the instantiation step
2022-10-28 00:48:31 +0000Midjak(~Midjak@82.66.147.146)
2022-10-28 00:48:50 +0000 <monochrom> The whole equation begins as (μ @ a) . (T (μ @ a)) = (μ @ a) . (μ @ T a)
2022-10-28 00:49:22 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Ping timeout: 250 seconds)
2022-10-28 00:50:07 +0000gurkenglas(~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 272 seconds)
2022-10-28 00:51:04 +0000 <EvanR> so Tμ involves fmap and μT doesn't
2022-10-28 00:51:05 +0000 <monochrom> I have given a not-so-good explanation of how to get to the usual math notation. Many CT books have good explanations.
2022-10-28 00:51:53 +0000 <EvanR> in any case this text "here Tμ and μT are formed by 'horizontal composition'" didn't immediately explain it
2022-10-28 00:51:56 +0000 <monochrom> Emily Riehl's has one. I think Fokkingga's "gentle introduction to category theory" has one too.
2022-10-28 00:52:08 +0000 <monochrom> To be honest I hate this math notation though.
2022-10-28 00:52:18 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
2022-10-28 00:52:29 +0000 <monochrom> Well yeah one has to learn "horizontal composition" first.
2022-10-28 00:53:00 +0000 <EvanR> well that's what I was doing, and on THAT page, it says it's an operation between two natural transformations and doesn't seem to explain the functor notation
2022-10-28 00:54:07 +0000 <EvanR> but now I gather it's like a functor preprocessor or postprocessor or something
2022-10-28 00:55:24 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-10-28 00:56:07 +0000 <EvanR> though in 1 of the 2 you didn't use fmap...
2022-10-28 00:56:38 +0000 <monochrom> Right.
2022-10-28 00:57:24 +0000 <monochrom> μT really comes from (μ @ T a) then dropping the a and the @
2022-10-28 00:57:51 +0000ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2022-10-28 00:58:10 +0000 <monochrom> In actual math notation it's μ<sub>T a</sub> then dropping the a and promoting the T from subscript to normal text.
2022-10-28 00:58:17 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 260 seconds)
2022-10-28 00:59:38 +0000 <monochrom> In Haskell it's "join . join = join . fmap join" so fmap happens on one side only.
2022-10-28 00:59:45 +0000jpds1(~jpds@gateway/tor-sasl/jpds) (Ping timeout: 258 seconds)
2022-10-28 00:59:48 +0000ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2022-10-28 01:00:09 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 01:00:32 +0000adanwan(~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
2022-10-28 01:01:26 +0000 <monochrom> You should also try to independently imagine how to write code for the type sig "T (T (T a)) -> T a", you will find two ways, and they are the two sides of the law.
2022-10-28 01:02:15 +0000 <EvanR> and in a monad, the two ways are equivalent?
2022-10-28 01:02:33 +0000 <monochrom> Yeah the monad law says we want them to do the same thing.
2022-10-28 01:02:49 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 01:04:12 +0000cytokine_storm(~cytokine_@user/cytokine-storm/x-1083107)
2022-10-28 01:04:42 +0000crns(~netcrns@user/crns) (Ping timeout: 260 seconds)
2022-10-28 01:05:44 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 01:06:05 +0000ChaiTRex(~ChaiTRex@user/chaitrex)
2022-10-28 01:06:09 +0000crns(~netcrns@p5dc33bf3.dip0.t-ipconnect.de)
2022-10-28 01:06:09 +0000crns(~netcrns@p5dc33bf3.dip0.t-ipconnect.de) (Changing host)
2022-10-28 01:06:09 +0000crns(~netcrns@user/crns)
2022-10-28 01:06:39 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 01:07:11 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 244 seconds)
2022-10-28 01:07:17 +0000adanwan(~adanwan@gateway/tor-sasl/adanwan)
2022-10-28 01:07:36 +0000 <EvanR> alright wikipedia calls Fμ and μF whiskering, there it is explained
2022-10-28 01:08:05 +0000codedmart(codedmart@2600:3c01::f03c:92ff:fefe:8511) (Quit: ZNC 1.7.5+deb4 - https://znc.in)
2022-10-28 01:08:20 +0000codedmart(codedmart@2600:3c01::f03c:92ff:fefe:8511)
2022-10-28 01:08:26 +0000 <monochrom> Yeah. I should have mentioned that name. I wasn't confident; I only saw it once (in Riehl's), wasn't sure it's the common name.
2022-10-28 01:08:42 +0000 <monochrom> (Then again I didn't read many CT books. Just maybe 3.)
2022-10-28 01:09:27 +0000adanwan(~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
2022-10-28 01:09:59 +0000 <EvanR> I already knew this notation and what it meant, forget it, but never heard of whiskering before
2022-10-28 01:10:04 +0000 <EvanR> forgot*
2022-10-28 01:10:06 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 01:10:36 +0000albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
2022-10-28 01:12:33 +0000machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Quit: Lost terminal)
2022-10-28 01:13:09 +0000 <EvanR> why do I care, well I was trying to follow this blog post which says 1. a monoid is a special case of a category 2. a category is special case of a monad and 3. a monad is a special case of a monoid
2022-10-28 01:13:17 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 01:13:29 +0000 <EvanR> so I got stuck making sure I knew what a monad is before he goes off the deep end making a category a monad
2022-10-28 01:14:07 +0000 <EvanR> https://graphicallinearalgebra.net/2017/04/16/a-monoid-is-a-category-a-category-is-a-monad-a-monad…
2022-10-28 01:15:37 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 01:16:43 +0000albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8)
2022-10-28 01:18:04 +0000polo_(~polo@user/polo)
2022-10-28 01:18:28 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 01:20:31 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 272 seconds)
2022-10-28 01:20:44 +0000polo(~polo@user/polo) (Ping timeout: 276 seconds)
2022-10-28 01:22:07 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 01:23:20 +0000polo_(~polo@user/polo) (Ping timeout: 276 seconds)
2022-10-28 01:25:24 +0000cytokine_storm(~cytokine_@user/cytokine-storm/x-1083107) (Quit: Quit)
2022-10-28 01:26:13 +0000Natch(~natch@c-9e07225c.038-60-73746f7.bbcust.telenor.se) (Ping timeout: 272 seconds)
2022-10-28 01:26:56 +0000zaquest(~notzaques@5.130.79.72) (Remote host closed the connection)
2022-10-28 01:27:18 +0000xff0x(~xff0x@2405:6580:b080:900:4ce0:8375:d2a4:aff0) (Ping timeout: 255 seconds)
2022-10-28 01:28:05 +0000zaquest(~notzaques@5.130.79.72)
2022-10-28 01:29:23 +0000Natch(~natch@c-9e07225c.038-60-73746f7.bbcust.telenor.se)
2022-10-28 01:30:26 +0000waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 244 seconds)
2022-10-28 01:32:42 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 260 seconds)
2022-10-28 01:33:59 +0000adanwan(~adanwan@gateway/tor-sasl/adanwan)
2022-10-28 01:39:13 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 244 seconds)
2022-10-28 01:39:38 +0000wroathe(~wroathe@user/wroathe) (Ping timeout: 250 seconds)
2022-10-28 01:40:50 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915)
2022-10-28 01:42:49 +0000waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-10-28 01:43:26 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
2022-10-28 01:45:57 +0000boxscape(~boxscape@81.191.27.107)
2022-10-28 01:46:02 +0000boxscapeboxscape_1
2022-10-28 01:47:24 +0000ec(~ec@gateway/tor-sasl/ec)
2022-10-28 01:48:25 +0000nilradical(~nilradica@user/naso) ()
2022-10-28 01:49:22 +0000boxscape_(~boxscape@81.191.27.107) (Ping timeout: 244 seconds)
2022-10-28 01:50:04 +0000jpds1(~jpds@gateway/tor-sasl/jpds)
2022-10-28 01:51:25 +0000jargon(~jargon@184.101.208.112) (Remote host closed the connection)
2022-10-28 01:55:13 +0000hsw(~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Ping timeout: 246 seconds)
2022-10-28 01:55:26 +0000gqplox(~textual@2a02:c7c:941d:fd00:4102:e413:2c06:9bc1) (Quit: My MacBook Air has gone to sleep. ZZZzzz…)
2022-10-28 01:55:52 +0000Kaipei(~Kaiepi@108.175.84.104)
2022-10-28 01:56:04 +0000gqplox(~textual@2a02:c7c:941d:fd00:4102:e413:2c06:9bc1)
2022-10-28 01:58:09 +0000nisstyre(~wes@li798-187.members.linode.com) (Changing host)
2022-10-28 01:58:09 +0000nisstyre(~wes@user/nisstyre)
2022-10-28 02:01:12 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-10-28 02:07:10 +0000xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
2022-10-28 02:08:51 +0000td_(~td@83.135.9.51) (Ping timeout: 260 seconds)
2022-10-28 02:09:10 +0000king_gs(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6)
2022-10-28 02:10:20 +0000td_(~td@83.135.9.42)
2022-10-28 02:13:25 +0000hsw(~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net)
2022-10-28 02:16:25 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 258 seconds)
2022-10-28 02:16:39 +0000polo(~polo@user/polo)
2022-10-28 02:17:00 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 02:18:47 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-10-28 02:25:17 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 240 seconds)
2022-10-28 02:26:34 +0000nate3(~nate@98.45.169.16)
2022-10-28 02:28:58 +0000polo(~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-10-28 02:30:29 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 02:31:27 +0000bitmapper(uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2022-10-28 02:36:12 +0000ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2022-10-28 02:36:30 +0000ec(~ec@gateway/tor-sasl/ec)
2022-10-28 02:36:33 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 02:37:28 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 02:38:59 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 02:43:13 +0000terrorjack(~terrorjac@2a01:4f8:1c1e:509a::1) (Quit: The Lounge - https://thelounge.chat)
2022-10-28 02:44:07 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 272 seconds)
2022-10-28 02:44:32 +0000terrorjack(~terrorjac@2a01:4f8:1c1e:509a::1)
2022-10-28 02:45:18 +0000mzan(~quassel@mail.asterisell.com) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
2022-10-28 02:46:19 +0000mzan(~quassel@mail.asterisell.com)
2022-10-28 02:46:47 +0000ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2022-10-28 02:46:50 +0000bitmapper(uid464869@id-464869.lymington.irccloud.com)
2022-10-28 02:48:58 +0000waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 246 seconds)
2022-10-28 02:49:23 +0000FinnElija(~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 258 seconds)
2022-10-28 02:49:33 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 02:51:23 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 02:52:26 +0000polo(~polo@user/polo)
2022-10-28 02:52:27 +0000FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-10-28 02:53:38 +0000ec(~ec@gateway/tor-sasl/ec)
2022-10-28 02:53:45 +0000 <talismanick> Is there a built-in function (context: using RIO) which is like `either` but auto-returns "mempty" on Right?
2022-10-28 02:54:25 +0000 <talismanick> something like `\handleErr -> either handleErr mempty`
2022-10-28 02:55:58 +0000 <talismanick> I wrote "flip either mempty <handle Left error case>" and now hlint won't shut up about "redundant flip"
2022-10-28 02:58:03 +0000iteratee(~kyle@162.218.222.107) (Ping timeout: 272 seconds)
2022-10-28 02:59:30 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 03:00:36 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 03:01:39 +0000ChaiTRex(~ChaiTRex@user/chaitrex) (Ping timeout: 258 seconds)
2022-10-28 03:03:35 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 03:03:42 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 250 seconds)
2022-10-28 03:08:19 +0000[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-10-28 03:09:26 +0000polo(~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-10-28 03:10:38 +0000ChaiTRex(~ChaiTRex@user/chaitrex)
2022-10-28 03:10:49 +0000king_gs(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6) (Remote host closed the connection)
2022-10-28 03:11:08 +0000king_gs(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6)
2022-10-28 03:11:37 +0000FinnElija(~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 258 seconds)
2022-10-28 03:12:09 +0000FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-10-28 03:12:37 +0000polo(~polo@user/polo)
2022-10-28 03:13:46 +0000vglfr(~vglfr@145.224.100.164) (Ping timeout: 244 seconds)
2022-10-28 03:16:18 +0000cyphase(~cyphase@user/cyphase) (Ping timeout: 252 seconds)
2022-10-28 03:17:36 +0000rembo10(~rembo10@main.remulis.com) (Quit: ZNC 1.8.2 - https://znc.in)
2022-10-28 03:20:06 +0000cyphase(~cyphase@user/cyphase)
2022-10-28 03:20:10 +0000rembo10(~rembo10@main.remulis.com)
2022-10-28 03:21:02 +0000nate3(~nate@98.45.169.16) (Ping timeout: 250 seconds)
2022-10-28 03:23:09 +0000polo(~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-10-28 03:23:24 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-10-28 03:23:24 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-10-28 03:23:24 +0000wroathe(~wroathe@user/wroathe)
2022-10-28 03:24:11 +0000AlexNoo(~AlexNoo@178.34.162.124) (Read error: Connection reset by peer)
2022-10-28 03:24:12 +0000polo(~polo@user/polo)
2022-10-28 03:24:34 +0000AlexNoo(~AlexNoo@178.34.162.124)
2022-10-28 03:28:50 +0000polo(~polo@user/polo) (Client Quit)
2022-10-28 03:29:24 +0000polo(~polo@user/polo)
2022-10-28 03:33:26 +0000slack4673(~slack1256@191.125.99.208) (Read error: Connection reset by peer)
2022-10-28 03:34:38 +0000king_gs(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6) (Ping timeout: 252 seconds)
2022-10-28 03:36:30 +0000[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer)
2022-10-28 03:38:30 +0000boxscape_1(~boxscape@81.191.27.107) (Remote host closed the connection)
2022-10-28 03:44:37 +0000Vajb(~Vajb@2001:999:504:1841:9e47:1ec7:a52e:1d57) (Read error: Connection reset by peer)
2022-10-28 03:44:49 +0000Vajb(~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi)
2022-10-28 03:47:18 +0000causal(~user@50.35.83.177)
2022-10-28 03:49:36 +0000Midjak(~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
2022-10-28 03:53:57 +0000jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 240 seconds)
2022-10-28 03:54:33 +0000adanwan(~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 258 seconds)
2022-10-28 03:57:39 +0000polo(~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-10-28 04:00:25 +0000polo(~polo@user/polo)
2022-10-28 04:03:13 +0000adanwan(~adanwan@gateway/tor-sasl/adanwan)
2022-10-28 04:11:52 +0000polo(~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-10-28 04:12:15 +0000jpds1(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2022-10-28 04:14:42 +0000wroathe(~wroathe@user/wroathe) (Ping timeout: 255 seconds)
2022-10-28 04:17:47 +0000arahael(~arahael@14-202-55-135.tpgi.com.au) (Ping timeout: 260 seconds)
2022-10-28 04:18:16 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Quit: ZNC - https://znc.in)
2022-10-28 04:20:29 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 04:22:07 +0000mbuf(~Shakthi@49.204.132.19)
2022-10-28 04:22:42 +0000k8yun(~k8yun@user/k8yun)
2022-10-28 04:25:55 +0000gqplox(~textual@2a02:c7c:941d:fd00:4102:e413:2c06:9bc1) (Quit: Textual IRC Client: www.textualapp.com)
2022-10-28 04:30:48 +0000troydm(~troydm@host-176-37-124-197.b025.la.net.ua)
2022-10-28 04:31:01 +0000arahael(~arahael@14-200-56-241.tpgi.com.au)
2022-10-28 04:31:09 +0000Vajb(~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-10-28 04:31:23 +0000Vajb(~Vajb@85-76-71-213-nat.elisa-mobile.fi)
2022-10-28 04:33:18 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 04:33:58 +0000k8yun(~k8yun@user/k8yun) (Quit: Leaving)
2022-10-28 04:35:39 +0000jonathanx(~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
2022-10-28 04:37:16 +0000jonathanx_(~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
2022-10-28 04:39:43 +0000bgs(~bgs@212-85-160-171.dynamic.telemach.net)
2022-10-28 04:40:20 +0000jonathanx(~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 250 seconds)
2022-10-28 04:40:26 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 04:44:37 +0000king_gs(~Thunderbi@187.201.83.115) (Ping timeout: 240 seconds)
2022-10-28 04:45:55 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 258 seconds)
2022-10-28 04:56:33 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-10-28 04:59:50 +0000raym(~ray@user/raym) (Ping timeout: 250 seconds)
2022-10-28 05:01:21 +0000tjakway(~tjakway@184.170.241.65)
2022-10-28 05:07:53 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 272 seconds)
2022-10-28 05:11:56 +0000jpds1(~jpds@gateway/tor-sasl/jpds)
2022-10-28 05:13:10 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 05:14:00 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-10-28 05:14:00 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-10-28 05:14:00 +0000wroathe(~wroathe@user/wroathe)
2022-10-28 05:15:55 +0000tjakway(~tjakway@184.170.241.65) (Quit: WeeChat 3.5)
2022-10-28 05:17:43 +0000king_gs(~Thunderbi@187.201.83.115) (Ping timeout: 255 seconds)
2022-10-28 05:18:45 +0000tjakway(~tjakway@cpe-107-184-74-161.socal.res.rr.com)
2022-10-28 05:27:41 +0000bgs(~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection)
2022-10-28 05:28:29 +0000jtomas(~jtomas@191.red-88-17-199.dynamicip.rima-tde.net)
2022-10-28 05:28:45 +0000polo(~polo@user/polo)
2022-10-28 05:29:54 +0000polo(~polo@user/polo) (Client Quit)
2022-10-28 05:36:11 +0000tomku(~tomku@user/tomku) (Ping timeout: 276 seconds)
2022-10-28 05:36:46 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 05:40:40 +0000ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2022-10-28 05:42:02 +0000ChaiTRex(~ChaiTRex@user/chaitrex)
2022-10-28 05:43:16 +0000Maeda(~Maeda@91-161-10-149.subs.proxad.net) (Quit: leaving)
2022-10-28 05:44:22 +0000Maeda(~Maeda@91-161-10-149.subs.proxad.net)
2022-10-28 05:46:31 +0000wroathe(~wroathe@user/wroathe) (Ping timeout: 272 seconds)
2022-10-28 05:47:01 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-10-28 05:54:23 +0000nshepperd(nshepperd@2600:3c03::f03c:92ff:fe28:92c9) (Quit: quit)
2022-10-28 05:54:31 +0000nshepperd(nshepperd@2600:3c03::f03c:92ff:fe28:92c9)
2022-10-28 05:56:55 +0000Maeda(~Maeda@91-161-10-149.subs.proxad.net) (Quit: leaving)
2022-10-28 05:57:34 +0000nate3(~nate@98.45.169.16)
2022-10-28 05:58:30 +0000Maeda(~Maeda@91-161-10-149.subs.proxad.net)
2022-10-28 06:00:57 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-10-28 06:01:19 +0000Maeda(~Maeda@91-161-10-149.subs.proxad.net) (Client Quit)
2022-10-28 06:02:22 +0000Maeda(~Maeda@91-161-10-149.subs.proxad.net)
2022-10-28 06:02:40 +0000nate3(~nate@98.45.169.16) (Ping timeout: 250 seconds)
2022-10-28 06:21:43 +0000hsw(~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Read error: Connection reset by peer)
2022-10-28 06:21:49 +0000hsw_(~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net)
2022-10-28 06:27:06 +0000mixfix41(~sdenynine@user/mixfix41)
2022-10-28 06:27:48 +0000detuneattune(~detuneatt@user/detuneattune) (Quit: The Lounge - https://thelounge.chat)
2022-10-28 06:28:04 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 246 seconds)
2022-10-28 06:28:50 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-10-28 06:29:07 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 06:32:08 +0000mixfix41(~sdenynine@user/mixfix41) (Ping timeout: 250 seconds)
2022-10-28 06:33:03 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 06:33:26 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 250 seconds)
2022-10-28 06:35:13 +0000king_gs(~Thunderbi@187.201.83.115) (Read error: Connection reset by peer)
2022-10-28 06:35:33 +0000coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2022-10-28 06:35:45 +0000king_gs(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6)
2022-10-28 06:37:46 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 250 seconds)
2022-10-28 06:41:25 +0000ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2022-10-28 06:42:06 +0000detuneattune(~detuneatt@user/detuneattune)
2022-10-28 06:43:08 +0000ChaiTRex(~ChaiTRex@user/chaitrex)
2022-10-28 06:43:10 +0000hsw_(~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Read error: Connection reset by peer)
2022-10-28 06:43:19 +0000hsw_(~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net)
2022-10-28 06:45:37 +0000mixfix41(~sdenynine@user/mixfix41)
2022-10-28 06:48:01 +0000raym(~ray@user/raym)
2022-10-28 06:52:14 +0000king_gs(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6) (Ping timeout: 276 seconds)
2022-10-28 06:52:27 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 06:52:59 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 06:55:57 +0000echoreply(~echoreply@45.32.163.16) (Quit: WeeChat 2.8)
2022-10-28 06:57:14 +0000echoreply(~echoreply@45.32.163.16)
2022-10-28 06:57:16 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 250 seconds)
2022-10-28 07:01:48 +0000lortabac(~lortabac@2a01:e0a:541:b8f0:e14a:54e1:f555:fbc8)
2022-10-28 07:04:55 +0000michalz(~michalz@185.246.207.200)
2022-10-28 07:06:14 +0000danza(~francesco@151.82.113.246)
2022-10-28 07:06:48 +0000gmg(~user@user/gehmehgeh)
2022-10-28 07:12:11 +0000jtomas(~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 260 seconds)
2022-10-28 07:13:07 +0000acidjnk_new(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de)
2022-10-28 07:13:07 +0000acidjnk(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de)
2022-10-28 07:15:34 +0000m5zs7k(aquares@web10.mydevil.net) (Ping timeout: 244 seconds)
2022-10-28 07:16:32 +0000Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2022-10-28 07:16:38 +0000m5zs7k(aquares@web10.mydevil.net)
2022-10-28 07:17:22 +0000CiaoSen(~Jura@p200300c95724d3002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-10-28 07:18:43 +0000mncheck(~mncheck@193.224.205.254)
2022-10-28 07:20:15 +0000king_gs(~Thunderbi@187.201.83.115) (Ping timeout: 272 seconds)
2022-10-28 07:22:37 +0000mixfix41(~sdenynine@user/mixfix41) (Remote host closed the connection)
2022-10-28 07:25:48 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-10-28 07:25:59 +0000ft(~ft@p508dbd59.dip0.t-ipconnect.de) (Quit: leaving)
2022-10-28 07:26:14 +0000tjakway(~tjakway@cpe-107-184-74-161.socal.res.rr.com) (Quit: WeeChat 3.5)
2022-10-28 07:26:41 +0000kenran(~user@user/kenran)
2022-10-28 07:26:49 +0000kenran(~user@user/kenran) (Remote host closed the connection)
2022-10-28 07:28:37 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 07:28:58 +0000jpds1(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2022-10-28 07:31:06 +0000jpds1(~jpds@gateway/tor-sasl/jpds)
2022-10-28 07:31:08 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 258 seconds)
2022-10-28 07:31:46 +0000mixfix41(~sdenynine@user/mixfix41)
2022-10-28 07:34:44 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 07:36:24 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 07:39:15 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 272 seconds)
2022-10-28 07:45:48 +0000raym(~ray@user/raym) (Ping timeout: 250 seconds)
2022-10-28 07:46:09 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 07:46:21 +0000infinity0(~infinity0@pwned.gg) (Remote host closed the connection)
2022-10-28 07:46:26 +0000infinity0_(~infinity0@pwned.gg)
2022-10-28 07:46:29 +0000infinity0_infinity0
2022-10-28 07:46:40 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 07:46:40 +0000zeenk(~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494)
2022-10-28 07:46:52 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 07:48:07 +0000mixfix41(~sdenynine@user/mixfix41) (Ping timeout: 272 seconds)
2022-10-28 07:50:16 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 07:51:32 +0000machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2022-10-28 07:52:05 +0000fserucas|eod(~fserucas|@2001:818:e376:a400:fb92:70c1:dd88:c7d7)
2022-10-28 07:52:36 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 264 seconds)
2022-10-28 07:56:57 +0000redmp(~redmp@mobile-166-170-43-64.mycingular.net) (Ping timeout: 240 seconds)
2022-10-28 07:58:09 +0000mmhat(~mmh@p200300f1c730768bee086bfffe095315.dip0.t-ipconnect.de)
2022-10-28 08:02:01 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 08:05:19 +0000mbuf(~Shakthi@49.204.132.19) (Quit: Leaving)
2022-10-28 08:12:15 +0000danza(~francesco@151.82.113.246) (Read error: Connection reset by peer)
2022-10-28 08:12:28 +0000cfricke(~cfricke@user/cfricke)
2022-10-28 08:18:10 +0000chele(~chele@user/chele)
2022-10-28 08:22:40 +0000chele(~chele@user/chele) (Remote host closed the connection)
2022-10-28 08:23:35 +0000jonathanx_(~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 272 seconds)
2022-10-28 08:24:20 +0000takuan(~takuan@178-116-218-225.access.telenet.be)
2022-10-28 08:29:27 +0000sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Quit: No Ping reply in 180 seconds.)
2022-10-28 08:30:05 +0000nate3(~nate@98.45.169.16)
2022-10-28 08:30:33 +0000sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
2022-10-28 08:32:53 +0000king_gs1(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6)
2022-10-28 08:32:55 +0000king_gs(~Thunderbi@187.201.83.115) (Read error: Connection reset by peer)
2022-10-28 08:32:55 +0000king_gs1king_gs
2022-10-28 08:33:44 +0000shriekingnoise(~shrieking@186.137.167.202) (Quit: Quit)
2022-10-28 08:35:37 +0000nate3(~nate@98.45.169.16) (Ping timeout: 272 seconds)
2022-10-28 08:38:02 +0000chele(~chele@user/chele)
2022-10-28 08:43:14 +0000erisco_(~erisco@d24-141-66-165.home.cgocable.net)
2022-10-28 08:45:07 +0000erisco(~erisco@d24-141-66-165.home.cgocable.net) (Ping timeout: 272 seconds)
2022-10-28 08:45:07 +0000erisco_erisco
2022-10-28 08:46:02 +0000king_gs(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6) (Ping timeout: 250 seconds)
2022-10-28 08:47:43 +0000Kaipii(~Kaiepi@108.175.84.104)
2022-10-28 08:50:45 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 08:51:27 +0000Kaipei(~Kaiepi@108.175.84.104) (Ping timeout: 272 seconds)
2022-10-28 08:55:08 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Ping timeout: 250 seconds)
2022-10-28 08:57:43 +0000__monty__(~toonn@user/toonn)
2022-10-28 09:08:01 +0000acidjnk_new3(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de)
2022-10-28 09:08:32 +0000jonathanx_(~jonathan@h-98-128-168-222.NA.cust.bahnhof.se)
2022-10-28 09:11:59 +0000acidjnk(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de) (Ping timeout: 276 seconds)
2022-10-28 09:13:00 +0000kenran(~user@user/kenran)
2022-10-28 09:13:07 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 09:17:54 +0000lortabac(~lortabac@2a01:e0a:541:b8f0:e14a:54e1:f555:fbc8) (Quit: WeeChat 2.8)
2022-10-28 09:20:15 +0000tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
2022-10-28 09:21:09 +0000ec(~ec@gateway/tor-sasl/ec) (Ping timeout: 258 seconds)
2022-10-28 09:22:16 +0000ec(~ec@gateway/tor-sasl/ec)
2022-10-28 09:22:36 +0000xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 252 seconds)
2022-10-28 09:23:49 +0000gmg(~user@user/gehmehgeh) (Remote host closed the connection)
2022-10-28 09:27:28 +0000KaipiiKaiepi
2022-10-28 09:28:43 +0000axeman(~quassel@212.129.76.63)
2022-10-28 09:29:27 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-10-28 09:31:27 +0000bitmapper(uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2022-10-28 09:33:04 +0000 <probie> Is there a convenient way to recurse over type-level naturals, or am I stuck defining something like `data N = Z | S N` and `type family ToNat (n :: Nat) :: N where`?
2022-10-28 09:34:50 +0000gmg(~user@user/gehmehgeh)
2022-10-28 09:35:12 +0000frost24(~frost@user/frost)
2022-10-28 09:35:37 +0000 <merijn> There is a convenient way! It's called "writing your code in Idris" :D
2022-10-28 09:35:42 +0000 <probie> I wrote iterated fmap (i.e `fmapn @2 (*2) [[1..4::Int],[2..7]] = [[2,4,6,8],[4,6,8,10,12,14]]`), but to use `Nat` I ended up needing a type like `fmapn :: forall n x y a b . FmapN (ToN n) x y a b => (a -> b) -> x -> y`
2022-10-28 09:36:27 +0000 <probie> s/(*2)/(*2::Int)/ (type inference does not play nicely here)
2022-10-28 09:38:57 +0000 <probie> merijn: and give up my laziness?
2022-10-28 09:41:09 +0000gurkenglas(~gurkengla@p548ac72e.dip0.t-ipconnect.de)
2022-10-28 09:41:26 +0000 <tomsmeding> some of us need to be strict and get some productive work done, once in a while, otherwise nothing would happen ;)
2022-10-28 09:42:03 +0000 <merijn> There's a threshold past which writing type level stuff is more pain than gain, and this seems well past this threshold, unless your name is Oleg :p
2022-10-28 09:42:59 +0000 <tomsmeding> but unless such a way has come into existence in the last two ghc versions or so, there is no way to conveniently recurse over ghc typelevel nats
2022-10-28 09:43:01 +0000king_gs(~Thunderbi@187.201.83.115) (Read error: Connection reset by peer)
2022-10-28 09:43:01 +0000king_gs1(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6)
2022-10-28 09:43:21 +0000 <tomsmeding> but iirc there was a package that already had conversions back and forth to an actual inductive natural number type
2022-10-28 09:45:20 +0000king_gs1king_gs
2022-10-28 09:50:30 +0000raym(~ray@user/raym)
2022-10-28 09:50:50 +0000axeman(~quassel@212.129.76.63) (Ping timeout: 252 seconds)
2022-10-28 09:51:23 +0000axeman(~quassel@212.129.77.169)
2022-10-28 09:54:30 +0000stiell_(~stiell@gateway/tor-sasl/stiell) (Ping timeout: 258 seconds)
2022-10-28 09:55:52 +0000econo(uid147250@user/econo) (Quit: Connection closed for inactivity)
2022-10-28 09:57:05 +0000eaxli(~eax@user/eaxli)
2022-10-28 09:58:06 +0000eaxli(~eax@user/eaxli) (Quit: leaving)
2022-10-28 09:58:09 +0000 <tomsmeding> talismanick: hlint not shutting up is easily solved by adding a .hlint.yaml file (if I remember the file name correctly) with some hints to ignore
2022-10-28 09:58:35 +0000 <merijn> I have this one simpel trick for shutting up hlint (Neil Mitchell hates him!)
2022-10-28 10:04:14 +0000 <tomsmeding> settings = { haskell = { plugin = { hlint = { globalOn = false } } } }
2022-10-28 10:08:10 +0000 <merijn> tomsmeding: I was thinking "rm `which hlint`", but sure :p
2022-10-28 10:08:52 +0000 <tomsmeding> merijn: I remember that at some point the path for that HLS setting changed, so I randomly got hlint notices again at some point
2022-10-28 10:08:53 +0000frost24(~frost@user/frost) (Quit: Client closed)
2022-10-28 10:09:07 +0000 <tomsmeding> I was like wait what no what changed
2022-10-28 10:14:23 +0000CiaoSen(~Jura@p200300c95724d3002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 276 seconds)
2022-10-28 10:14:57 +0000axeman(~quassel@212.129.77.169) (Ping timeout: 240 seconds)
2022-10-28 10:15:02 +0000 <Profpatsch> newtype RevList a = RevList [a]
2022-10-28 10:15:04 +0000 <Profpatsch> deriving (Semigroup) via (Dual [a])
2022-10-28 10:15:07 +0000 <Profpatsch> Can I make this work somehow?
2022-10-28 10:16:43 +0000 <tomsmeding> > :set -XDerivingVia -XDerivingStrategies
2022-10-28 10:16:45 +0000 <lambdabot> <hint>:1:1: error: parse error on input ‘:’
2022-10-28 10:16:52 +0000 <tomsmeding> % :set -XDerivingVia -XDerivingStrategies
2022-10-28 10:16:52 +0000 <yahb2> <no output>
2022-10-28 10:16:54 +0000 <Profpatsch> I guess I can add the Dual constructor to the RevList constructor
2022-10-28 10:16:54 +0000 <tomsmeding> % import Data.Monoid
2022-10-28 10:16:54 +0000 <yahb2> <no output>
2022-10-28 10:17:00 +0000 <tomsmeding> % newtype RevList a = RevList [a] deriving (Semigroup) via (Dual [a]) deriving (Show)
2022-10-28 10:17:00 +0000 <yahb2> <no output>
2022-10-28 10:17:05 +0000 <tomsmeding> % RevList [1..4] <> RevList [5..8]
2022-10-28 10:17:05 +0000 <yahb2> RevList [5,6,7,8,1,2,3,4]
2022-10-28 10:17:09 +0000 <tomsmeding> Profpatsch: seems to work
2022-10-28 10:17:18 +0000 <Profpatsch> tomsmeding: huuuh
2022-10-28 10:17:29 +0000 <Profpatsch> maybe I’m missing an extension
2022-10-28 10:17:54 +0000 <tomsmeding> both extensions that you need to enable are clearly indicated in the error you get
2022-10-28 10:17:56 +0000 <tomsmeding> so unlikely
2022-10-28 10:18:12 +0000 <Profpatsch> tomsmeding: one sec
2022-10-28 10:18:26 +0000 <Profpatsch> tomsmeding: https://zerobin.verklagmichdo.ch/paste/oQbaRRFW#pMEIil63xvsyWeAlN1n0kd2MhmNBpfvG6z1bK+Uo2OV
2022-10-28 10:18:37 +0000 <Profpatsch> Oh I should read the error message
2022-10-28 10:18:41 +0000 <Profpatsch> I have to import the Dual constructor
2022-10-28 10:18:46 +0000 <tomsmeding> :)
2022-10-28 10:18:47 +0000 <tomsmeding> yes
2022-10-28 10:18:55 +0000 <Profpatsch> lol
2022-10-28 10:18:57 +0000 <Profpatsch> sorry
2022-10-28 10:19:07 +0000 <tomsmeding> 'coerce' will try to not "use" stuff that you wouldn't be able to use normally
2022-10-28 10:19:24 +0000 <Profpatsch> prime hls potential
2022-10-28 10:19:36 +0000 <Profpatsch> but prob nontrivial to implement a suggestion to import Dual
2022-10-28 10:19:48 +0000td_(~td@83.135.9.42) (Ping timeout: 252 seconds)
2022-10-28 10:19:49 +0000 <Profpatsch> I really need to get into hls dev
2022-10-28 10:20:02 +0000 <merijn> Sure, but do you wanna implement custom warnings for every newtype in hls?
2022-10-28 10:20:27 +0000 <merijn> Would be more sensible to work on the machine interface for GHC errors and have that integrated in there
2022-10-28 10:20:33 +0000 <tomsmeding> merijn: I guess it could recognise "The data constructor `bla' of newtype `bla' is not in scope", and suggest import
2022-10-28 10:20:37 +0000 <tomsmeding> yes for sure
2022-10-28 10:20:43 +0000 <Profpatsch> well the GHC error would have to be structured enough
2022-10-28 10:21:00 +0000 <Profpatsch> to turn the part that says “you might not have imported Dual” into a hls suggestion
2022-10-28 10:21:10 +0000 <merijn> Profpatsch: There's a running project for structured GHC errors
2022-10-28 10:21:21 +0000 <Profpatsch> So I guess by extension I’d have to get into GHC development lol
2022-10-28 10:21:27 +0000 <Profpatsch> neverending rabbit holes
2022-10-28 10:21:44 +0000 <merijn> tbh, GHC is pretty easy to work on if you're not touching the scary parts (type checker)
2022-10-28 10:21:54 +0000 <Profpatsch> every nix user is a nix developer
2022-10-28 10:21:58 +0000 <Profpatsch> every haskell user is a ghc developer
2022-10-28 10:22:01 +0000 <merijn> One of my first ever Haskell contributions was a GHC patch
2022-10-28 10:22:28 +0000 <merijn> The problem is that not every Haskell user is a GHC developer :p
2022-10-28 10:22:29 +0000 <geekosaur> I have yet to contrib a patch but I review RTS code
2022-10-28 10:22:58 +0000 <Profpatsch> the structured errors would be exposed via the GHC lib?
2022-10-28 10:23:22 +0000 <merijn> Actually my *two* first Haskell contributiosn where GHC and I'm kinda proud of both, despite being trivial :p
2022-10-28 10:23:48 +0000 <Profpatsch> https://gitlab.haskell.org/ghc/ghc/-/issues/18516
2022-10-28 10:24:42 +0000beteigeuze(~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
2022-10-28 10:26:02 +0000 <Profpatsch> I feel like this is too abstract tho
2022-10-28 10:26:31 +0000 <Profpatsch> It would be better to just start with ideas for hls suggestions, and push them upstream by implementing the minimal amount of structure needed for these suggestions in GHC lib
2022-10-28 10:27:05 +0000 <Profpatsch> (keeping that interface unstable between GHC versions until a nice interface is reached by experimentation)
2022-10-28 10:27:55 +0000 <tomsmeding> I think programming against another unstable ghc interface is the absolute last thing that hls developers are looking for
2022-10-28 10:27:57 +0000 <Profpatsch> then hls can add more and more stuff per GHC version without having to resort to dump string parsing
2022-10-28 10:28:14 +0000 <Profpatsch> *dumb
2022-10-28 10:28:30 +0000 <Profpatsch> tomsmeding: anything is more stable than parsing string output
2022-10-28 10:28:41 +0000xff0x(~xff0x@2405:6580:b080:900:2e5f:ef77:7c98:ca52)
2022-10-28 10:29:19 +0000 <Profpatsch> well, string is the universal interface :P
2022-10-28 10:29:26 +0000td_(~td@83.135.9.42)
2022-10-28 10:29:37 +0000 <Profpatsch> as per the unix philosophy
2022-10-28 10:29:40 +0000 <merijn> Profpatsch: hls is already ginormous
2022-10-28 10:29:48 +0000 <Profpatsch> merijn: why?
2022-10-28 10:29:53 +0000 <merijn> Profpatsch: Making it bigger with tons of custom code is undesirable
2022-10-28 10:30:44 +0000axeman(~quassel@212.129.78.247)
2022-10-28 10:31:04 +0000 <Profpatsch> merijn: by that metric we should just outright delete 3 quarters of the Cabal codebase :)
2022-10-28 10:31:54 +0000 <Profpatsch> which reminds me, I still have to finish the hoogle patches I submitted
2022-10-28 10:32:20 +0000 <merijn> Except deleting that cabal could would break working things, I'm saying we shouldn't *add more* if possible
2022-10-28 10:32:41 +0000 <Profpatsch> merijn: is anybody using backpack? :)
2022-10-28 10:32:54 +0000mmhat(~mmh@p200300f1c730768bee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.7.1)
2022-10-28 10:33:01 +0000 <tomsmeding> kmett is, I think
2022-10-28 10:33:12 +0000 <Franciman> i am
2022-10-28 10:33:14 +0000 <Franciman> in ocaml
2022-10-28 10:33:16 +0000 <Franciman> way better
2022-10-28 10:33:18 +0000 <Profpatsch> lol
2022-10-28 10:33:22 +0000 <Profpatsch> touche
2022-10-28 10:33:25 +0000 <merijn> backpack is kinda dead due to ezyang getting hired away from Haskell into writing pytorch stuff
2022-10-28 10:33:26 +0000 <Profpatsch> éééé
2022-10-28 10:33:38 +0000 <merijn> As he was the driving force behind its implementation
2022-10-28 10:33:44 +0000perrierjouet(~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Ping timeout: 252 seconds)
2022-10-28 10:34:14 +0000 <Profpatsch> Oh you can derive multiple things in the same clause super cool deriving (Semigroup, Monoid) via (Dual [a])
2022-10-28 10:41:36 +0000acidjnk_new3(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2022-10-28 10:42:20 +0000acidjnk_new(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de) (Ping timeout: 276 seconds)
2022-10-28 10:42:46 +0000kenran(~user@user/kenran) (Remote host closed the connection)
2022-10-28 10:47:46 +0000stiell_(~stiell@gateway/tor-sasl/stiell)
2022-10-28 10:59:44 +0000acidjnk_new3(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de)
2022-10-28 10:59:44 +0000acidjnk_new(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de)
2022-10-28 11:00:20 +0000acidjnk_new(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de) (Client Quit)
2022-10-28 11:00:30 +0000axeman(~quassel@212.129.78.247) (Ping timeout: 252 seconds)
2022-10-28 11:05:01 +0000birdgoose(~jesse@2406:e003:1d87:6601:e725:b6b4:ace8:4ebe)
2022-10-28 11:13:45 +0000Kaiepi(~Kaiepi@108.175.84.104) (Quit: Leaving)
2022-10-28 11:15:18 +0000Kaiepi(~Kaiepi@108.175.84.104)
2022-10-28 11:29:13 +0000shriekingnoise(~shrieking@186.137.167.202)
2022-10-28 11:30:16 +0000frost53(~frost@user/frost)
2022-10-28 11:32:21 +0000Midjak(~Midjak@82.66.147.146)
2022-10-28 11:42:50 +0000birdgoose(~jesse@2406:e003:1d87:6601:e725:b6b4:ace8:4ebe) (Ping timeout: 250 seconds)
2022-10-28 11:47:33 +0000jtomas(~jtomas@191.red-88-17-199.dynamicip.rima-tde.net)
2022-10-28 11:49:25 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 272 seconds)
2022-10-28 11:53:05 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-10-28 11:56:15 +0000frost53(~frost@user/frost) (Quit: Client closed)
2022-10-28 11:57:43 +0000frost70(~frost@user/frost)
2022-10-28 12:04:50 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 258 seconds)
2022-10-28 12:09:32 +0000yuzhao(~yuzhao@36.112.45.73)
2022-10-28 12:15:03 +0000geekosaur(~geekosaur@xmonad/geekosaur) (Quit: Leaving)
2022-10-28 12:15:37 +0000albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
2022-10-28 12:15:57 +0000jmdaemon(~jmdaemon@user/jmdaemon) (Ping timeout: 240 seconds)
2022-10-28 12:16:36 +0000yuzhao(~yuzhao@36.112.45.73) (Read error: Connection reset by peer)
2022-10-28 12:17:36 +0000geekosaur(~geekosaur@xmonad/geekosaur)
2022-10-28 12:17:54 +0000 <MangoIV[m]> Does anybody here have know a good library to work with formal grammars? I mainly need cf.
2022-10-28 12:19:48 +0000cheater(~Username@user/cheater) (Quit: BitchX: fit to feel groovy)
2022-10-28 12:19:53 +0000chomwitt(~chomwitt@2a02:587:dc10:8200:1ac0:4dff:fedb:a3f1)
2022-10-28 12:20:36 +0000cheater(~Username@user/cheater)
2022-10-28 12:21:44 +0000albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8)
2022-10-28 12:22:20 +0000 <MangoIV[m]> s/have//
2022-10-28 12:22:39 +0000 <merijn> Work in what way?
2022-10-28 12:23:44 +0000acidjnk_new3(~acidjnk@p200300d6e7137a04040206df7d69f9dc.dip0.t-ipconnect.de) (Ping timeout: 276 seconds)
2022-10-28 12:23:47 +0000 <MangoIV[m]> construct them in an eDSL, do algorithms on them, generate strings from them, stuff like that.
2022-10-28 12:24:24 +0000leagueoflegends(~leagueofl@user/leagueoflegends)
2022-10-28 12:24:34 +0000raek(raek@2a01:7e01::f03c:93ff:fedf:bffe)
2022-10-28 12:24:37 +0000 <leagueoflegends> what is a monad and can you give a code example/
2022-10-28 12:24:50 +0000yuzhao(~yuzhao@36.112.45.73)
2022-10-28 12:26:41 +0000 <geekosaur> http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html
2022-10-28 12:27:17 +0000 <geekosaur> you don't care about anything beyond that
2022-10-28 12:27:58 +0000frost70(~frost@user/frost) (Ping timeout: 244 seconds)
2022-10-28 12:28:59 +0000ec(~ec@gateway/tor-sasl/ec) (Ping timeout: 258 seconds)
2022-10-28 12:31:22 +0000 <leagueoflegends> wait
2022-10-28 12:31:22 +0000yuzhao(~yuzhao@36.112.45.73) (Ping timeout: 250 seconds)
2022-10-28 12:31:36 +0000nate3(~nate@98.45.169.16)
2022-10-28 12:31:49 +0000 <leagueoflegends> leading up to a monad is a function that returns two separate times
2022-10-28 12:31:56 +0000 <leagueoflegends> or at the same time
2022-10-28 12:32:53 +0000 <probie> What is an iterable and can you give a code example?
2022-10-28 12:34:10 +0000king_gs(~Thunderbi@2806:103e:29:47b9:f34b:ffff:4cfc:90a6) (Ping timeout: 246 seconds)
2022-10-28 12:34:27 +0000 <leagueoflegends> in what languge
2022-10-28 12:34:29 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 12:34:29 +0000 <leagueoflegends> language
2022-10-28 12:35:18 +0000 <merijn> leagueoflegends: Trying to understand the idea behind "monad" without first learning Haskell's type system and typeclasses is kinda futile, it won't make much sense. And once you understand how the types and typeclasses work then it's mostly obvious
2022-10-28 12:36:05 +0000 <geekosaur> returning two things at the same time is just a tuple
2022-10-28 12:36:13 +0000 <probie> leagueoflegends: In doesn't matter which language. The "joke" is that it defines an interface and many things satisfy that interface.
2022-10-28 12:36:13 +0000 <leagueoflegends> oh
2022-10-28 12:36:28 +0000nate3(~nate@98.45.169.16) (Ping timeout: 255 seconds)
2022-10-28 12:38:05 +0000nilradical(~nilradica@user/naso)
2022-10-28 12:39:13 +0000 <leagueoflegends> what's the preferred way to install haskell on windows
2022-10-28 12:39:17 +0000 <probie> For an example of a valid, but useless monad `data AMonad a = AMonad`, `instance Functor AMonad where fmap _ _ = AMonad` `instance Applicative AMonad where {pure _ = AMonad; (<*>) _ _ = AMonad}` `instance Monad AMonad where (>>=) _ _ = AMonad`
2022-10-28 12:39:47 +0000 <probie> On all platforms, if you're not using nix, via ghcup
2022-10-28 12:40:07 +0000 <leagueoflegends> why can't I just download an installer
2022-10-28 12:41:46 +0000 <geekosaur> people use installers these days?
2022-10-28 12:42:34 +0000 <leagueoflegends> never mind
2022-10-28 12:42:37 +0000 <leagueoflegends> I'll use ghcip
2022-10-28 12:42:40 +0000 <leagueoflegends> ghcup
2022-10-28 12:44:11 +0000 <leagueoflegends> what is stack?
2022-10-28 12:44:23 +0000CiaoSen(~Jura@p200300c95724d3002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-10-28 12:46:39 +0000 <leagueoflegends> should I install stack?
2022-10-28 12:47:00 +0000 <probie> A build tool. It used to very popular, but it's less popular these days after many of the good ideas it introduced landed in cabal. Unless you're learning by following a tutorial that explicitly uses it, I wouldn't worry about it
2022-10-28 12:47:09 +0000 <probie> s/used to very/used to be very/
2022-10-28 12:47:12 +0000lortabac(~lortabac@2a01:e0a:541:b8f0:16c5:7e8f:5f7a:cef6)
2022-10-28 12:47:48 +0000 <leagueoflegends> I said yes to the haskell language server as I want to use vscode or vim etc with haskell
2022-10-28 12:48:03 +0000 <leagueoflegends> unless I'm doing something very wrong
2022-10-28 12:48:39 +0000 <probie> Installing hls is probably a good idea
2022-10-28 12:52:34 +0000 <leagueoflegends> is there any reason why GHC is so big say compared to a C compiler/
2022-10-28 12:52:42 +0000 <leagueoflegends> ?*
2022-10-28 12:52:42 +0000 <lambdabot> Maybe you meant: v @ ? .
2022-10-28 12:55:03 +0000 <geekosaur> it's doing a lot more than a C compiler
2022-10-28 12:55:52 +0000 <leagueoflegends> ghc is .5gb while gcc is like .05gb
2022-10-28 12:58:34 +0000 <merijn> leagueoflegends: A lot of gcc's install size is hidden inside your OS :p I have a user install of gcc in my homedir, it's 1.6 GB. Clang is well over 4-5 GB
2022-10-28 12:58:34 +0000 <leagueoflegends> oops I accidentally install stack
2022-10-28 12:58:43 +0000 <leagueoflegends> oh
2022-10-28 12:58:55 +0000 <leagueoflegends> installed*
2022-10-28 12:59:07 +0000 <leagueoflegends> will it conflict with cabal
2022-10-28 12:59:20 +0000 <probie> The source for gcc is larger than the source for GHC thought :p
2022-10-28 12:59:27 +0000 <probie> stack doesn't conflict with cabal
2022-10-28 12:59:38 +0000 <probie> in fact, stack still needs cabal
2022-10-28 12:59:49 +0000littlefinger(~littlefin@pool-100-15-237-121.washdc.fios.verizon.net)
2022-10-28 12:59:53 +0000 <probie> s/thought/though/
2022-10-28 12:59:58 +0000constxd(~brad@47.55.121.233)
2022-10-28 13:03:02 +0000 <merijn> probie: stack still needs Cabal it doesn't need cabal (the executable, aka cabal-install)
2022-10-28 13:03:52 +0000 <leagueoflegends> do you recommend vim or neovim
2022-10-28 13:04:10 +0000 <leagueoflegends> and ghcup installed haskell successfully
2022-10-28 13:04:15 +0000 <leagueoflegends> I guess that's a start
2022-10-28 13:05:10 +0000 <probie> merijn: does ghcup install them separately? I live in a nix world
2022-10-28 13:06:17 +0000lortabac(~lortabac@2a01:e0a:541:b8f0:16c5:7e8f:5f7a:cef6) (Ping timeout: 240 seconds)
2022-10-28 13:07:38 +0000 <geekosaur> ghcup initially installs just ghc (9.2.4 currently) and HLS. `ghcup tui` lets you install stack and/or cabal
2022-10-28 13:07:51 +0000 <geekosaur> (or `ghcup install stack`/`ghcup install cabal`)
2022-10-28 13:07:57 +0000troydm(~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 272 seconds)
2022-10-28 13:08:08 +0000 <probie> leagueoflegends: I think neovim with coc is gaining ground over regular vim, but I'm an emacs user and most of my coworkers use vscode, so take my opinion with a grain of salt
2022-10-28 13:08:32 +0000 <merijn> probie: I dunno, I don't use ghcup, because I'm a grumpy old man
2022-10-28 13:09:15 +0000 <geekosaur> <-- this grumpy old man uses ghcup. and even vscode for some things. but not nvim+coc
2022-10-28 13:10:25 +0000 <MangoIV[m]> <MangoIV[m]> "Does anybody here have know a..." <- bumping this. Ideally it would also have an efficient representation for the grammars.
2022-10-28 13:11:16 +0000 <geekosaur> might work better to ask on reddit or the discourse
2022-10-28 13:11:24 +0000 <merijn> or haskell-cafe, yeah
2022-10-28 13:11:29 +0000lortabac(~lortabac@37.166.20.4)
2022-10-28 13:14:30 +0000jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
2022-10-28 13:16:00 +0000lortabac(~lortabac@37.166.20.4) (Ping timeout: 250 seconds)
2022-10-28 13:17:41 +0000lortabac(~lortabac@2a01:e0a:541:b8f0:a2d7:73b4:5d4c:1129)
2022-10-28 13:20:54 +0000 <leagueoflegends> what is coc
2022-10-28 13:23:17 +0000L29Ah(~L29Ah@wikipedia/L29Ah) (Ping timeout: 240 seconds)
2022-10-28 13:23:56 +0000 <geekosaur> language server protocol plugin for nvim
2022-10-28 13:24:15 +0000 <geekosaur> lets it speak to HLS and other LSP engines (for C, JS, etc.)
2022-10-28 13:24:24 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 264 seconds)
2022-10-28 13:26:09 +0000ec(~ec@gateway/tor-sasl/ec)
2022-10-28 13:26:13 +0000L29Ah(~L29Ah@wikipedia/L29Ah)
2022-10-28 13:27:56 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-10-28 13:32:57 +0000ft(~ft@p508dbd59.dip0.t-ipconnect.de)
2022-10-28 13:34:59 +0000littlefinger(~littlefin@pool-100-15-237-121.washdc.fios.verizon.net) (Quit: Client closed)
2022-10-28 13:36:06 +0000nilradical(~nilradica@user/naso) (Remote host closed the connection)
2022-10-28 13:37:05 +0000nilradical(~nilradica@user/naso)
2022-10-28 13:38:56 +0000 <leagueoflegends> what's the preferred way to install haskell in ubuntu?
2022-10-28 13:39:23 +0000cfricke(~cfricke@user/cfricke) (Quit: WeeChat 3.7.1)
2022-10-28 13:40:13 +0000vpan(~0@212.117.1.172)
2022-10-28 13:40:44 +0000jonathanx__(~jonathan@h-98-128-168-222.NA.cust.bahnhof.se)
2022-10-28 13:43:31 +0000king_gs(~Thunderbi@187.201.83.115) (Ping timeout: 255 seconds)
2022-10-28 13:45:19 +0000jonathanx_(~jonathan@h-98-128-168-222.NA.cust.bahnhof.se) (Ping timeout: 272 seconds)
2022-10-28 13:45:26 +0000 <geekosaur> same way. most OS distros have very old versions of GHC
2022-10-28 13:45:57 +0000jonathanx__(~jonathan@h-98-128-168-222.NA.cust.bahnhof.se) (Ping timeout: 272 seconds)
2022-10-28 13:52:04 +0000 <leagueoflegends> ok, thanks
2022-10-28 13:55:02 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-10-28 13:55:02 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-10-28 13:55:02 +0000wroathe(~wroathe@user/wroathe)
2022-10-28 13:55:22 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 13:56:22 +0000nilradical(~nilradica@user/naso) (Remote host closed the connection)
2022-10-28 13:57:34 +0000Tuplanolla(~Tuplanoll@91-159-69-11.elisa-laajakaista.fi)
2022-10-28 13:58:59 +0000slack1256(~slack1256@186.11.47.202)
2022-10-28 13:59:48 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Ping timeout: 252 seconds)
2022-10-28 14:00:39 +0000slac95907(~slack1256@191.125.99.208)
2022-10-28 14:00:44 +0000nilradical(~nilradica@user/naso)
2022-10-28 14:02:17 +0000jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 240 seconds)
2022-10-28 14:02:51 +0000wroathe(~wroathe@user/wroathe) (Ping timeout: 260 seconds)
2022-10-28 14:03:28 +0000slack1256(~slack1256@186.11.47.202) (Ping timeout: 252 seconds)
2022-10-28 14:04:15 +0000nilradical(~nilradica@user/naso) (Remote host closed the connection)
2022-10-28 14:04:31 +0000nilradical(~nilradica@user/naso)
2022-10-28 14:05:07 +0000gurkenglas(~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 255 seconds)
2022-10-28 14:07:03 +0000mncheck(~mncheck@193.224.205.254) (Quit: Leaving)
2022-10-28 14:07:09 +0000mncheckm(~mncheck@193.224.205.254)
2022-10-28 14:07:22 +0000gmg(~user@user/gehmehgeh) (Quit: Leaving)
2022-10-28 14:13:06 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 14:13:37 +0000Sgeo(~Sgeo@user/sgeo)
2022-10-28 14:15:37 +0000sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Quit: No Ping reply in 180 seconds.)
2022-10-28 14:16:44 +0000sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
2022-10-28 14:18:15 +0000king_gs(~Thunderbi@187.201.83.115) (Ping timeout: 272 seconds)
2022-10-28 14:27:16 +0000jonathanx(~jonathan@94.234.119.48)
2022-10-28 14:28:39 +0000mastarija(~mastarija@188.252.199.190)
2022-10-28 14:30:21 +0000pavonia(~user@user/siracusa) (Quit: Bye!)
2022-10-28 14:30:39 +0000 <mastarija> If I have this function in a file `foo = id :: Ord a => a -> a`, and load it into ghci and say `:t x = foo []` I get `[] :: Ord a => [a]`.
2022-10-28 14:31:38 +0000 <mastarija> However, if I write `x = foo []` alongside the `foo` in that same file I get an error saying "ambiguous type variable a0 prevents constraint Ord a0 from being solved"
2022-10-28 14:31:44 +0000 <mastarija> If I don't add the type signature.
2022-10-28 14:32:32 +0000king_gs(~Thunderbi@187.201.83.115)
2022-10-28 14:34:07 +0000king_gs(~Thunderbi@187.201.83.115) (Client Quit)
2022-10-28 14:36:42 +0000 <dolio> That's the monomorphism restriction.
2022-10-28 14:37:14 +0000Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542)
2022-10-28 14:38:46 +0000 <mastarija> Ah.. I thought that too, and have added the MonomorphismRestriction extension instead of NoMonomorphismRestriction
2022-10-28 14:38:49 +0000 <mastarija> x/
2022-10-28 14:39:54 +0000 <mastarija> thanks dolio
2022-10-28 14:40:00 +0000 <dolio> No problem.
2022-10-28 14:42:15 +0000tomku(~tomku@user/tomku)
2022-10-28 14:44:01 +0000burakcank(burakcank@has.arrived.and.is.ready-to.party) (Killed (NickServ (GHOST command used by burakcank_!B438@free.znc.bg)))
2022-10-28 14:44:15 +0000burakcank(bnc4free@has.arrived.and.is.ready-to.party)
2022-10-28 14:44:44 +0000mastarija(~mastarija@188.252.199.190) (Quit: Leaving)
2022-10-28 14:46:24 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 15:04:02 +0000chele(~chele@user/chele) (Remote host closed the connection)
2022-10-28 15:04:35 +0000coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2022-10-28 15:04:37 +0000CiaoSen(~Jura@p200300c95724d3002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
2022-10-28 15:05:38 +0000jonathanx(~jonathan@94.234.119.48) (Ping timeout: 250 seconds)
2022-10-28 15:06:14 +0000lortabac(~lortabac@2a01:e0a:541:b8f0:a2d7:73b4:5d4c:1129) (Ping timeout: 276 seconds)
2022-10-28 15:09:02 +0000boxscape(~boxscape@81.191.27.107)
2022-10-28 15:09:16 +0000econo(uid147250@user/econo)
2022-10-28 15:10:02 +0000[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-10-28 15:12:22 +0000jonathanx(~jonathan@c-5eea7730-74736162.cust.telenor.se)
2022-10-28 15:13:10 +0000leagueoflegends(~leagueofl@user/leagueoflegends) (Remote host closed the connection)
2022-10-28 15:24:09 +0000jakalx(~jakalx@base.jakalx.net) ()
2022-10-28 15:25:41 +0000jakalx(~jakalx@base.jakalx.net)
2022-10-28 15:26:07 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 255 seconds)
2022-10-28 15:28:22 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 255 seconds)
2022-10-28 15:31:10 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-10-28 15:32:28 +0000mrvdb(~mrvdb@185.92.221.186) (Quit: ZNC 1.8.2 - https://znc.in)
2022-10-28 15:34:34 +0000jonathanx(~jonathan@c-5eea7730-74736162.cust.telenor.se) (Remote host closed the connection)
2022-10-28 15:34:55 +0000mrvdb(~mrvdb@185.92.221.186)
2022-10-28 15:34:56 +0000jonathanx(~jonathan@94.234.119.48)
2022-10-28 15:36:36 +0000boxscapeboxscape_
2022-10-28 15:40:10 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 15:46:06 +0000jonathanx(~jonathan@94.234.119.48) (Ping timeout: 260 seconds)
2022-10-28 15:49:58 +0000acidjnk_new3(~acidjnk@p200300d6e7137a26d59898e5c9870d6b.dip0.t-ipconnect.de)
2022-10-28 15:56:18 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 15:56:37 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 15:56:53 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 15:57:25 +0000zeenk(~zeenk@2a02:2f04:a105:5d00:c862:f190:2ea:d494) (Quit: Konversation terminated!)
2022-10-28 16:00:04 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 16:00:22 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 16:04:22 +0000bitmapper(uid464869@id-464869.lymington.irccloud.com)
2022-10-28 16:06:19 +0000 <monochrom> EvanR: I now wonder if wikiepedia had a typo. If it said instead "here T
2022-10-28 16:06:21 +0000 <monochrom> err
2022-10-28 16:06:53 +0000 <monochrom> EvanR: I now wonder if wikiepedia had a typo. If it said instead "here Tµ and µT are formed by whiskering", that would be perfect.
2022-10-28 16:08:34 +0000mrvdb(~mrvdb@185.92.221.186) (Quit: ZNC 1.8.2 - https://znc.in)
2022-10-28 16:08:50 +0000mrvdb(~mrvdb@2001:19f0:5000:8582:5400:ff:fe07:3df5)
2022-10-28 16:08:56 +0000jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
2022-10-28 16:10:20 +0000jonathanx(~jonathan@c-5eea738b-74736162.cust.telenor.se)
2022-10-28 16:16:49 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 16:18:25 +0000jonathanx_(~jonathan@c-5eea664b-74736162.cust.telenor.se)
2022-10-28 16:20:37 +0000jonathanx_(~jonathan@c-5eea664b-74736162.cust.telenor.se) (Remote host closed the connection)
2022-10-28 16:20:57 +0000jonathanx_(~jonathan@c-5eea664b-74736162.cust.telenor.se)
2022-10-28 16:21:07 +0000jonathanx(~jonathan@c-5eea738b-74736162.cust.telenor.se) (Ping timeout: 272 seconds)
2022-10-28 16:21:54 +0000Kaiepi(~Kaiepi@108.175.84.104) (Ping timeout: 255 seconds)
2022-10-28 16:24:07 +0000jonathanx_(~jonathan@c-5eea664b-74736162.cust.telenor.se) (Read error: Connection reset by peer)
2022-10-28 16:25:00 +0000jonathanx_(~jonathan@c-5eea664b-74736162.cust.telenor.se)
2022-10-28 16:26:34 +0000phma(~phma@host-67-44-208-88.hnremote.net) (Read error: Connection reset by peer)
2022-10-28 16:27:21 +0000phma(~phma@2001:5b0:212a:cc58:94b0:45f6:bc48:ff7d)
2022-10-28 16:27:44 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-10-28 16:28:43 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 272 seconds)
2022-10-28 16:31:15 +0000fserucas|eod(~fserucas|@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Quit: Leaving)
2022-10-28 16:31:29 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-10-28 16:31:50 +0000azimut(~azimut@gateway/tor-sasl/azimut)
2022-10-28 16:33:06 +0000nate3(~nate@98.45.169.16)
2022-10-28 16:33:46 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 16:35:05 +0000titibandit(~titibandi@xdsl-87-78-36-34.nc.de)
2022-10-28 16:37:37 +0000nate3(~nate@98.45.169.16) (Ping timeout: 240 seconds)
2022-10-28 16:40:15 +0000jonathanx(~jonathan@94.234.102.75)
2022-10-28 16:40:18 +0000jonathanx_(~jonathan@c-5eea664b-74736162.cust.telenor.se) (Remote host closed the connection)
2022-10-28 16:43:45 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-10-28 16:43:45 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-10-28 16:43:45 +0000wroathe(~wroathe@user/wroathe)
2022-10-28 16:44:58 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 16:47:48 +0000mixfix41(~sdeny9ee@user/mixfix41)
2022-10-28 16:50:32 +0000nilradical(~nilradica@user/naso) ()
2022-10-28 16:51:23 +0000redmp(~redmp@eduroam-169-233-187-108.ucsc.edu)
2022-10-28 16:51:55 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 16:54:06 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-10-28 16:55:57 +0000wroathe(~wroathe@user/wroathe) (Ping timeout: 272 seconds)
2022-10-28 16:56:10 +0000jpds1(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2022-10-28 16:56:48 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 264 seconds)
2022-10-28 16:57:36 +0000vpan(~0@212.117.1.172) (Quit: Leaving.)
2022-10-28 16:58:09 +0000jonathanx_(~jonathan@c-5eea664b-74736162.cust.telenor.se)
2022-10-28 16:58:43 +0000jpds1(~jpds@gateway/tor-sasl/jpds)
2022-10-28 16:58:53 +0000Guest2776(~Guest27@2001:448a:7028:49a2:c005:3fe8:2bc0:33bd)
2022-10-28 16:59:25 +0000Guest2776(~Guest27@2001:448a:7028:49a2:c005:3fe8:2bc0:33bd) (Client Quit)
2022-10-28 17:00:56 +0000wootehfoot(~wootehfoo@user/wootehfoot)
2022-10-28 17:01:57 +0000jonathanx(~jonathan@94.234.102.75) (Ping timeout: 240 seconds)
2022-10-28 17:02:42 +0000boxscape_(~boxscape@81.191.27.107) (Remote host closed the connection)
2022-10-28 17:02:59 +0000boxscape(~boxscape@81.191.27.107)
2022-10-28 17:03:08 +0000boxscapeboxscape_
2022-10-28 17:03:24 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 17:05:09 +0000cross(~cross@spitfire.i.gajendra.net) (Quit: leaving)
2022-10-28 17:07:20 +0000johnw(~johnw@2600:1700:cf00:db0:24dd:7cba:243c:c819)
2022-10-28 17:10:09 +0000coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2022-10-28 17:11:14 +0000 <EvanR> monochrom, ah. Feel free to change it xD
2022-10-28 17:13:57 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 17:14:06 +0000 <EvanR> but also by a leap of logic, whiskering is horizontal composition where one of the natural transformations is identity
2022-10-28 17:15:08 +0000 <EvanR> Tµ =desugar=> id_T * µ
2022-10-28 17:15:14 +0000Kaiepi(~Kaiepi@108.175.84.104)
2022-10-28 17:15:31 +0000 <EvanR> µT =desugar=> µ * id_T
2022-10-28 17:21:26 +0000slack1256(~slack1256@186.11.44.138)
2022-10-28 17:23:31 +0000slac95907(~slack1256@191.125.99.208) (Ping timeout: 260 seconds)
2022-10-28 17:28:06 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-10-28 17:29:30 +0000jtomas(~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 250 seconds)
2022-10-28 17:30:16 +0000beteigeuze(~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Ping timeout: 252 seconds)
2022-10-28 17:31:25 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 272 seconds)
2022-10-28 17:31:26 +0000jakalx(~jakalx@base.jakalx.net) ()
2022-10-28 17:31:48 +0000jtomas(~jtomas@191.red-88-17-199.dynamicip.rima-tde.net)
2022-10-28 17:32:38 +0000sadmax2(~user@cpe-76-186-137-164.tx.res.rr.com)
2022-10-28 17:33:24 +0000jakalx(~jakalx@base.jakalx.net)
2022-10-28 17:34:50 +0000sadmax2(~user@cpe-76-186-137-164.tx.res.rr.com) (Remote host closed the connection)
2022-10-28 17:39:44 +0000jonathanx(~jonathan@c-5eea74d9-74736162.cust.telenor.se)
2022-10-28 17:40:31 +0000gurkenglas(~gurkengla@p548ac72e.dip0.t-ipconnect.de)
2022-10-28 17:41:29 +0000sadmax(~user@cpe-76-186-137-164.tx.res.rr.com)
2022-10-28 17:42:11 +0000jonathanx_(~jonathan@c-5eea664b-74736162.cust.telenor.se) (Ping timeout: 260 seconds)
2022-10-28 17:44:28 +0000titibandit(~titibandi@xdsl-87-78-36-34.nc.de) (Quit: Leaving.)
2022-10-28 17:46:18 +0000tzh(~tzh@c-24-21-73-154.hsd1.or.comcast.net)
2022-10-28 17:51:52 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 17:52:39 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 17:54:07 +0000 <monochrom> EvanR: Ah, thanks.
2022-10-28 17:55:07 +0000slack3102(~slack1256@191.126.99.208)
2022-10-28 17:57:18 +0000slack1256(~slack1256@186.11.44.138) (Ping timeout: 255 seconds)
2022-10-28 17:58:00 +0000ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2022-10-28 17:58:06 +0000berberman(~berberman@user/berberman) (Ping timeout: 250 seconds)
2022-10-28 17:58:44 +0000ec(~ec@gateway/tor-sasl/ec)
2022-10-28 18:03:11 +0000 <monochrom> EvanR: Riehl's textbook (Category Theory in Context) section 1.7 has a brief intro to 2-catgories. It may help you decode that blog. Her homepage has the book in PDF for free: https://math.jhu.edu/~eriehl/
2022-10-28 18:04:38 +0000 <monochrom> Actually https://emilyriehl.github.io/ may be a more active page, heh.
2022-10-28 18:10:19 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 18:10:54 +0000jonathanx_(~jonathan@c-5eea63bf-74736162.cust.telenor.se)
2022-10-28 18:12:24 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 250 seconds)
2022-10-28 18:13:36 +0000jonathanx(~jonathan@c-5eea74d9-74736162.cust.telenor.se) (Ping timeout: 264 seconds)
2022-10-28 18:15:34 +0000birdgoose(~jesse@2406:e003:1d87:6601:e725:b6b4:ace8:4ebe)
2022-10-28 18:18:17 +0000sadmax(~user@cpe-76-186-137-164.tx.res.rr.com) (Ping timeout: 272 seconds)
2022-10-28 18:18:47 +0000 <EvanR> cool
2022-10-28 18:19:29 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 18:21:14 +0000jonathanx_(~jonathan@c-5eea63bf-74736162.cust.telenor.se) (Ping timeout: 276 seconds)
2022-10-28 18:24:06 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 250 seconds)
2022-10-28 18:25:24 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 250 seconds)
2022-10-28 18:26:53 +0000 <jean-paul[m]> `CString` is just an alias for `Ptr CChar` so any function, like `newCString` or `withCString` that gives you a `CString` might be giving you null, right?
2022-10-28 18:28:16 +0000 <monochrom> Actually I doubt it.
2022-10-28 18:29:09 +0000wootehfoot(~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer)
2022-10-28 18:30:37 +0000 <jean-paul[m]> That would be great. But do I have to read GHC source or something to know for sure?
2022-10-28 18:30:58 +0000 <jean-paul[m]> (if so, easier to just assume they could give me NULL, I think)
2022-10-28 18:31:13 +0000 <monochrom> The source code rabbit hole seems to go through a "failWhenNULL" so you get an exception or you get a non-null pointer.
2022-10-28 18:34:04 +0000birdgoose(~jesse@2406:e003:1d87:6601:e725:b6b4:ace8:4ebe) (Ping timeout: 250 seconds)
2022-10-28 18:36:28 +0000acidjnk_new3(~acidjnk@p200300d6e7137a26d59898e5c9870d6b.dip0.t-ipconnect.de) (Ping timeout: 255 seconds)
2022-10-28 18:37:27 +0000acidjnk_new3(~acidjnk@p200300d6e7137a26d59898e5c9870d6b.dip0.t-ipconnect.de)
2022-10-28 18:37:36 +0000birdgoose(~jesse@151.210.175.160)
2022-10-28 18:41:11 +0000eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
2022-10-28 18:43:03 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 18:43:35 +0000jakalx(~jakalx@base.jakalx.net) (Error from remote client)
2022-10-28 18:44:15 +0000birdgoose(~jesse@151.210.175.160) (Ping timeout: 272 seconds)
2022-10-28 18:45:14 +0000jakalx(~jakalx@base.jakalx.net)
2022-10-28 18:48:03 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 272 seconds)
2022-10-28 18:50:24 +0000jpds1(~jpds@gateway/tor-sasl/jpds) (Ping timeout: 258 seconds)
2022-10-28 18:51:49 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 18:55:14 +0000jpds1(~jpds@gateway/tor-sasl/jpds)
2022-10-28 18:56:17 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 240 seconds)
2022-10-28 19:05:48 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 19:12:49 +0000danza(~francesco@151.68.150.173)
2022-10-28 19:13:28 +0000troydm(~troydm@host-176-37-124-197.b025.la.net.ua)
2022-10-28 19:18:01 +0000 <gurkenglas> Let Phi be some set of functions Reals->Reals. Their pointwise infimum is at each point their greatest lower bound. This acts like an optic that can turn "all f in Phi satisfy foo(f) <= bar(f)" into "their pointwise infimum g satisfies foo(g) <= bar(f)" whenever foo and bar are monotonic. Thus it can turn "all Phi are monotonic/1-lipschitz/concave" into "their pointwise infimum is
2022-10-28 19:18:07 +0000 <gurkenglas> monotonic/1-lipschitz/concave". I thought I would mention that here since I was surprised to be reminded of optics.
2022-10-28 19:19:16 +0000 <gurkenglas> s/foo(g) <= bar(f)/foo(g) <= bar(g)/ :(
2022-10-28 19:23:18 +0000thyriaen(~thyriaen@2a01:aea0:dd4:470d:6245:cbff:fe9f:48b1)
2022-10-28 19:24:48 +0000gqplox(~textual@2a02:c7c:941d:fd00:40a0:1c9d:7a12:f334)
2022-10-28 19:25:33 +0000slack1256(~slack1256@181.42.52.169)
2022-10-28 19:26:25 +0000jinsun__(~jinsun@user/jinsun)
2022-10-28 19:26:25 +0000jinsunGuest7738
2022-10-28 19:26:25 +0000Guest7738(~jinsun@user/jinsun) (Killed (iridium.libera.chat (Nickname regained by services)))
2022-10-28 19:26:25 +0000jinsun__jinsun
2022-10-28 19:26:37 +0000slack3102(~slack1256@191.126.99.208) (Ping timeout: 240 seconds)
2022-10-28 19:28:17 +0000 <gqplox> Hello guys
2022-10-28 19:28:37 +0000 <gqplox> I have made a project in pytohn I want to convert it to haskell to learn haskell
2022-10-28 19:28:58 +0000 <gqplox> However, for it i need to read toml and csv files
2022-10-28 19:29:05 +0000 <gqplox> what is the easiest way to do it
2022-10-28 19:29:29 +0000 <energizer> <EvanR: so a transpose of a 0 x inf matrix> but why is the empty arglist in zip() a 0 x inf matrix instead of, say, a 0 x 0 matrix?
2022-10-28 19:29:44 +0000 <gqplox> Basically i want to focus on actually transforming the data for now and later on i can learn the io and monad stuff
2022-10-28 19:29:59 +0000 <gqplox> but for now i just want a simple way to get the data in so i can do haskell stuff on it
2022-10-28 19:30:12 +0000 <jean-paul[m]> gqplox: Maybe set aside the idea of "easiest" and just learn some stuff.
2022-10-28 19:30:29 +0000 <EvanR> jean-paul[m], withCString uses allocaArray, which uses ... ... allocaBytesAlignedAndUnchecked which newAlignedPinnedByteArray# which can't fail
2022-10-28 19:30:47 +0000 <geekosaur> we generally use cassava to read csv. dunno about toml
2022-10-28 19:30:48 +0000 <EvanR> except that it is IO so anything can fail if you try hard enough
2022-10-28 19:31:04 +0000 <monochrom> Perhaps choose a project that doesn't read toml.
2022-10-28 19:31:05 +0000 <jean-paul[m]> gqplox: You can type things like "toml" and "yaml" into the search box on https://hoogle.haskell.org/ if you want to use libraries for this.
2022-10-28 19:31:12 +0000 <EvanR> energizer, it isn't
2022-10-28 19:31:29 +0000 <EvanR> there's no way to know using only list rep
2022-10-28 19:31:56 +0000 <energizer> EvanR: so why would zip() be an inf x 0 matrix?
2022-10-28 19:32:02 +0000 <EvanR> my observations just highlight all the important missing information in a ill typed variadic zip
2022-10-28 19:32:16 +0000 <EvanR> energizer, repeat () would represent inf x 0 matrix
2022-10-28 19:32:53 +0000 <EvanR> someone else suggested that is what zip() should return
2022-10-28 19:33:12 +0000 <EvanR> more like, zip( a 0 x inf matrix ) should return repeat ()
2022-10-28 19:33:12 +0000 <energizer> EvanR: but you think it's ambiguous?
2022-10-28 19:33:29 +0000 <energizer> EvanR: *but you think zip() is ambiguous?
2022-10-28 19:33:31 +0000 <EvanR> and zip ( 0 x 17 matrix ) should return 17 ()s
2022-10-28 19:33:57 +0000 <gqplox> yeah okay fair enough
2022-10-28 19:34:07 +0000 <gqplox> thx for the website btw, looks helpful
2022-10-28 19:34:33 +0000 <EvanR> zip() with no other information is ambiguous, such as what size you want
2022-10-28 19:34:50 +0000 <jean-paul[m]> monochrom, EvanR : thanks
2022-10-28 19:35:11 +0000 <monochrom> I did nothing :)
2022-10-28 19:35:22 +0000 <jean-paul[m]> gqplox: Personally I found https://www.cis.upenn.edu/~cis1940/fall16/ to be a good resource to work though.
2022-10-28 19:35:32 +0000 <EvanR> if your name is on the paper you're good
2022-10-28 19:35:35 +0000 <jean-paul[m]> Hmmm nope, that's not the right link at all (maybe it is good but I haven't done it yet)
2022-10-28 19:35:43 +0000 <gqplox> oh haha
2022-10-28 19:35:53 +0000 <gqplox> right now i am doing programming in haskell by Graham Hutton
2022-10-28 19:35:56 +0000 <geekosaur> @where cis194
2022-10-28 19:35:57 +0000 <lambdabot> https://www.seas.upenn.edu/~cis194/spring13/lectures.html
2022-10-28 19:36:06 +0000 <geekosaur> is the usually recommended one hereabouts
2022-10-28 19:36:07 +0000 <energizer> EvanR: i am sorta persuaded that zip is fairly tho not exactly monoidal, in which case repeat () is right
2022-10-28 19:36:11 +0000 <geekosaur> but hutton's good too
2022-10-28 19:36:16 +0000 <gqplox> im not far through but im eager to build stuff now that's why i was asking
2022-10-28 19:36:19 +0000 <jean-paul[m]> Yes, thanks, that's the one.
2022-10-28 19:36:40 +0000mvk(~mvk@2607:fea8:5ce3:8500::f30b)
2022-10-28 19:36:48 +0000 <gqplox> i understand your point, best to just learn properly
2022-10-28 19:37:02 +0000 <monochrom> Dive-in projects are more haste less speed.
2022-10-28 19:37:33 +0000 <monochrom> (Oh it "worked" when you switched from python to javascript because the difference was too small.)
2022-10-28 19:38:23 +0000 <gqplox> haha :) i understand your point
2022-10-28 19:38:29 +0000 <gqplox> oh this website looks cool
2022-10-28 19:38:40 +0000 <gqplox> the seas.upenn
2022-10-28 19:38:52 +0000 <monochrom> "I already speak American English. I want to learn Australian English by the dive-in project of writing a review for an Australian-accent movie." This works.
2022-10-28 19:39:17 +0000 <monochrom> "I already speak American English. I want to learn Japanese by the dive-in project of writing a review for a Japanese movie." This breaks.
2022-10-28 19:39:28 +0000 <c_wraith> I learned Haskell starting with making changes to a production system. It's not impossible, but you do need to be motivated by things like "This is hard and I want to learn it all"
2022-10-28 19:39:52 +0000 <c_wraith> That was 14 years ago and I have not yet learned it all
2022-10-28 19:40:14 +0000 <gqplox> yep i understand
2022-10-28 19:40:23 +0000 <c_wraith> But I have learned a whole lot!
2022-10-28 19:40:47 +0000 <gqplox> in this case it was a very minor thing, if i can get the toml and csv files into variables i can do it
2022-10-28 19:40:55 +0000 <gqplox> anyway ill look at the upenn
2022-10-28 19:42:13 +0000 <monochrom> There is also the prospect of not porting a python code base to haskell, instead write in haskell from scratch and implement the same features.
2022-10-28 19:42:39 +0000 <monochrom> Indeed you wouldn't even try to translate C++ to C.
2022-10-28 19:43:49 +0000 <gqplox> Yep that's what I meant sorry
2022-10-28 19:43:58 +0000 <gqplox> and its like a 200 lines script haha
2022-10-28 19:44:03 +0000 <gqplox> woah the .lhs is so cool
2022-10-28 19:44:24 +0000 <monochrom> OK that works better.
2022-10-28 19:46:38 +0000 <monochrom> Alternatively, dive-in projects can work (even for arbitrarily large gaps) if you manage your expectations. (Tautology: All frustrations can be solved by managing expectations.)
2022-10-28 19:48:06 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-10-28 19:48:19 +0000 <monochrom> The first dive-in project alerts you to a million things you need to learn first. Learning them can take a long time. If you don't have a conflicting expectation, you will persevere.
2022-10-28 19:48:46 +0000 <monochrom> This initial investment amortizes. The 2nd, 3rd, ... projects will be much faster.
2022-10-28 19:50:10 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-10-28 19:50:34 +0000eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-10-28 19:52:04 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-10-28 19:52:44 +0000coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2022-10-28 19:58:44 +0000machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Quit: leaving)
2022-10-28 19:59:56 +0000machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2022-10-28 20:02:11 +0000redmp(~redmp@eduroam-169-233-187-108.ucsc.edu) (Ping timeout: 260 seconds)
2022-10-28 20:02:28 +0000waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-10-28 20:07:01 +0000 <gurkenglas> yeah i gave up on my 2nd and 3rd project much faster than on my 1st
2022-10-28 20:07:21 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 20:10:23 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 272 seconds)
2022-10-28 20:11:10 +0000birdgoose(~jesse@2406:e003:1d87:6601:e725:b6b4:ace8:4ebe)
2022-10-28 20:11:12 +0000hpc(~juzz@ip98-169-32-242.dc.dc.cox.net) (Ping timeout: 264 seconds)
2022-10-28 20:11:49 +0000 <c_wraith> see how much faster you reached the natural conclusion?
2022-10-28 20:12:36 +0000hpc(~juzz@ip98-169-32-242.dc.dc.cox.net)
2022-10-28 20:13:46 +0000 <darkling> If only I'd learned to give up programming 40 years ago. :)
2022-10-28 20:15:09 +0000 <gurkenglas> noticing that training giving up allocates my skill ranks to Giving Up put such a pin into trying :D
2022-10-28 20:16:46 +0000hpc(~juzz@ip98-169-32-242.dc.dc.cox.net) (Ping timeout: 250 seconds)
2022-10-28 20:23:28 +0000hpc(~juzz@ip98-169-32-242.dc.dc.cox.net)
2022-10-28 20:23:55 +0000kjak(~kjak@pool-108-31-114-135.washdc.fios.verizon.net) (Quit: leaving)
2022-10-28 20:24:19 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 20:26:57 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 20:28:25 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 246 seconds)
2022-10-28 20:30:57 +0000irrgit__(~irrgit@176.113.74.74)
2022-10-28 20:31:31 +0000iteratee(~kyle@162.218.222.107)
2022-10-28 20:33:49 +0000irrgit_(~irrgit@176.113.74.130) (Ping timeout: 244 seconds)
2022-10-28 20:34:21 +0000slack1256(~slack1256@181.42.52.169) (Ping timeout: 255 seconds)
2022-10-28 20:34:35 +0000nate3(~nate@98.45.169.16)
2022-10-28 20:35:36 +0000irrgit_(~irrgit@176.113.74.74)
2022-10-28 20:38:02 +0000gqplox(~textual@2a02:c7c:941d:fd00:40a0:1c9d:7a12:f334) (Quit: Textual IRC Client: www.textualapp.com)
2022-10-28 20:38:56 +0000irrgit__(~irrgit@176.113.74.74) (Ping timeout: 260 seconds)
2022-10-28 20:39:17 +0000nate3(~nate@98.45.169.16) (Ping timeout: 240 seconds)
2022-10-28 20:45:51 +0000jtomas(~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 272 seconds)
2022-10-28 20:46:15 +0000titibandit(~titibandi@xdsl-87-78-36-34.nc.de)
2022-10-28 20:47:24 +0000irrgit_(~irrgit@176.113.74.74) (Read error: Connection reset by peer)
2022-10-28 20:48:29 +0000titibandit(~titibandi@xdsl-87-78-36-34.nc.de) (Remote host closed the connection)
2022-10-28 20:51:39 +0000tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Read error: Connection reset by peer)
2022-10-28 20:52:10 +0000polo(~polo@user/polo)
2022-10-28 20:52:25 +0000polo(~polo@user/polo) (Client Quit)
2022-10-28 20:52:31 +0000jmdaemon(~jmdaemon@user/jmdaemon)
2022-10-28 20:52:44 +0000polo(~polo@user/polo)
2022-10-28 20:53:36 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 20:54:37 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 20:56:27 +0000nek0(~nek0@2a01:4f8:222:2b41::12) (Quit: The Lounge - https://thelounge.chat)
2022-10-28 21:01:47 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 21:03:13 +0000lisbeths(uid135845@id-135845.lymington.irccloud.com)
2022-10-28 21:03:14 +0000bilegeek(~bilegeek@2600:1008:b027:7f32:a99b:c297:feda:8531)
2022-10-28 21:03:16 +0000 <cpli> are there async `Chan`s?
2022-10-28 21:03:26 +0000 <cpli> i.e. where one may await `readChan`?
2022-10-28 21:03:35 +0000 <monochrom> You can just use TChan.
2022-10-28 21:04:16 +0000 <monochrom> Or Chan, too.
2022-10-28 21:04:49 +0000 <EvanR> isn't await readChan already what readChan does
2022-10-28 21:06:07 +0000mncheckm(~mncheck@193.224.205.254) (Ping timeout: 272 seconds)
2022-10-28 21:10:01 +0000 <cpli> so if i race between readChan and anything else, it's cancel safe?
2022-10-28 21:13:43 +0000takuan(~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
2022-10-28 21:15:03 +0000 <dsal> cpli: Not super clear what you mean. If you're waiting for a channel value in a transaction and get killed, it should be safe, but if you completed the transaction and were killed, it's not going to magically fix stuff.
2022-10-28 21:19:05 +0000beteigeuze(~Thunderbi@bl14-81-220.dsl.telepac.pt)
2022-10-28 21:26:46 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
2022-10-28 21:30:03 +0000raek(raek@2a01:7e01::f03c:93ff:fedf:bffe) (WeeChat 3.0)
2022-10-28 21:35:12 +0000mvk(~mvk@2607:fea8:5ce3:8500::f30b) (Ping timeout: 250 seconds)
2022-10-28 21:38:53 +0000bitmapper(uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2022-10-28 21:38:58 +0000 <EvanR> if you're thinking of cancelling something doing a readChan then it does sound like you're at least going to need TChan
2022-10-28 21:39:29 +0000 <EvanR> either the entire atomically containing readTChan happens or it doesn't
2022-10-28 21:39:50 +0000 <EvanR> (STM)
2022-10-28 21:46:55 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 21:51:07 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6)
2022-10-28 21:51:12 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-10-28 21:52:35 +0000 <cpli> perfect thank
2022-10-28 21:54:25 +0000redmp(~redmp@eduroam-169-233-187-108.ucsc.edu)
2022-10-28 21:56:59 +0000mvk(~mvk@2607:fea8:5ce3:8500::f30b)
2022-10-28 21:57:03 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
2022-10-28 21:59:21 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-10-28 21:59:33 +0000talismanick(~talismani@76.133.152.122) (Remote host closed the connection)
2022-10-28 22:00:13 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-10-28 22:00:13 +0000wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-10-28 22:00:13 +0000wroathe(~wroathe@user/wroathe)
2022-10-28 22:03:44 +0000michalz(~michalz@185.246.207.200) (Remote host closed the connection)
2022-10-28 22:03:48 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 250 seconds)
2022-10-28 22:04:24 +0000fjmorazan(~quassel@user/fjmorazan) ()
2022-10-28 22:05:08 +0000fjmorazan(~quassel@user/fjmorazan)
2022-10-28 22:06:25 +0000wroathe(~wroathe@user/wroathe) (Ping timeout: 246 seconds)
2022-10-28 22:06:26 +0000talismanick(~talismani@76.133.152.122)
2022-10-28 22:07:30 +0000axeman(~quassel@ip-037-201-153-145.um10.pools.vodafone-ip.de)
2022-10-28 22:08:24 +0000acidjnk_new3(~acidjnk@p200300d6e7137a26d59898e5c9870d6b.dip0.t-ipconnect.de) (Ping timeout: 255 seconds)
2022-10-28 22:09:44 +0000__monty__(~toonn@user/toonn) (Quit: leaving)
2022-10-28 22:11:20 +0000pavonia(~user@user/siracusa)
2022-10-28 22:11:39 +0000polo(~polo@user/polo) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-10-28 22:12:07 +0000polo(~polo@user/polo)
2022-10-28 22:13:15 +0000 <cpli> is there some `TChan A -> TChan A -> TChan A` which fuses two channels?
2022-10-28 22:13:28 +0000 <cpli> i.e. for writing purposes only
2022-10-28 22:14:16 +0000 <cpli> dup and clone exist, would fusing require doing so on a seperate thread?
2022-10-28 22:14:33 +0000caryhartline(~caryhartl@2600:1700:2d0:8d30:41f8:4e00:54f7:b844)
2022-10-28 22:15:41 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 22:15:42 +0000 <EvanR> what does fusing for writing purpose mean
2022-10-28 22:15:53 +0000 <dminuoso> Or for reading purposes.
2022-10-28 22:16:06 +0000 <EvanR> or append purpose
2022-10-28 22:16:10 +0000 <dminuoso> That is, if both channels have multiple things, in what order should they read?
2022-10-28 22:16:40 +0000 <dminuoso> Looking at the internals, I think you can construct an interleaving TChan without a thread
2022-10-28 22:16:54 +0000 <DigitalKiwi> no append only prepend
2022-10-28 22:17:08 +0000 <EvanR> this is haskell we can only prepend
2022-10-28 22:17:17 +0000 <DigitalKiwi> :D
2022-10-28 22:17:58 +0000 <EvanR> haskellOS
2022-10-28 22:18:09 +0000 <EvanR> all the files are stored backwards
2022-10-28 22:18:35 +0000 <dminuoso> Well anyway, an interleaving TChan could be constructed if the internals were exposed in Control.Concurrent.STM.TChan
2022-10-28 22:18:44 +0000 <dminuoso> But they are not, so I guess you're out of luck either way
2022-10-28 22:18:53 +0000 <dminuoso> I dont see a way without a separate thread doing what you want
2022-10-28 22:19:08 +0000 <DigitalKiwi> https://mostlyabsurd.com/files/2022-10-28-171849_964x357_scrot.png
2022-10-28 22:19:08 +0000polo(~polo@user/polo) (Ping timeout: 276 seconds)
2022-10-28 22:20:16 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 250 seconds)
2022-10-28 22:20:53 +0000 <cpli> re:dminuoso "..., in what order should they read?"; in order they were written
2022-10-28 22:21:07 +0000 <dminuoso> cpli: What does that even mean in STM?
2022-10-28 22:22:27 +0000 <cpli> i have a `[Backend]` where `data Backend = B1 B1State | B2 B2State | B3...`
2022-10-28 22:22:50 +0000 <cpli> each `Backend` broadcasts its event to all other backends
2022-10-28 22:23:16 +0000 <dsal> "order" over distinct things (e.g., two threads with two channels) is a coincidence when you observe it.
2022-10-28 22:23:22 +0000 <cpli> in some wrapper `data Event = E1 FromB1 | E2 FromB2`
2022-10-28 22:23:48 +0000 <cpli> all backends are concurrently executed
2022-10-28 22:23:59 +0000 <dminuoso> cpli: STM works differently
2022-10-28 22:24:07 +0000 <dminuoso> It's not just barriers.
2022-10-28 22:25:01 +0000 <cpli> is there any <10min read on how to impl async broadcasting?
2022-10-28 22:25:51 +0000 <dsal> The stm docs are pretty clear. You just dup a chan and write to it.
2022-10-28 22:26:05 +0000 <monochrom> There is no need to "merge" two TChans. Instead, to read from both TChans with "whichever one has a message first, read it", use atomically (fmap Left readTChan c1 <|> fmap Right readTChan c2) or equivalent.
2022-10-28 22:26:08 +0000 <int-e> DigitalKiwi: 4 centuries earlier: REPENT! REPENT!
2022-10-28 22:26:11 +0000 <cpli> if i write to a chan and immediately read, do i read my own message?
2022-10-28 22:26:26 +0000 <dsal> https://hackage.haskell.org/package/stm-2.5.1.0/docs/Control-Concurrent-STM-TChan.html#v:dupTChan
2022-10-28 22:26:45 +0000 <dminuoso> monochrom: Im not sure "first" really applies.
2022-10-28 22:26:49 +0000 <DigitalKiwi> https://twitter.com/ArchKiwi/status/1586120762544398336
2022-10-28 22:27:05 +0000 <monochrom> Sure, s/first/"first"
2022-10-28 22:27:14 +0000 <dminuoso> monochrom: Consider the case where first `c2` has a message, the stm transaction proceeds, but gets retried.
2022-10-28 22:27:43 +0000 <dminuoso> Is there any guarantee c2 will be picked again, even if after retrying c1 has a message?
2022-10-28 22:28:00 +0000 <dsal> cpli: maybe? You've not shown enough code to say for sure.
2022-10-28 22:28:56 +0000TonyStone(~TonyStone@cpe-74-76-51-197.nycap.res.rr.com) (Remote host closed the connection)
2022-10-28 22:29:29 +0000 <dsal> dminuoso: I'm pretty sure that code won't read from c2 until c1 is empty. To make that fairer, you could put the channels in a queue of some sort and make sure each time a channel is read from it goes to the end of the list.
2022-10-28 22:29:41 +0000 <dsal> Doing the go thing of "randomly pick a ready channel" might be a little harder.
2022-10-28 22:29:52 +0000 <dminuoso> dsal: well, if c1 is empty at the time the transaction is started
2022-10-28 22:30:00 +0000 <dminuoso> but has data when its retried.
2022-10-28 22:30:23 +0000 <dminuoso> The only way I can see fairness is if you put them into a single list with a tag
2022-10-28 22:30:28 +0000 <dminuoso> Then you can preserve the original order.
2022-10-28 22:30:50 +0000 <monochrom> Oh the beauty is that every observation can be explained away by a fictional sequence, and you have no way to refute it, right?
2022-10-28 22:31:00 +0000 <monochrom> or fictional history.
2022-10-28 22:32:48 +0000thyriaen_(~thyriaen@2a01:aea0:dd4:470d:6245:cbff:fe9f:48b1)
2022-10-28 22:32:49 +0000buffet(~buffet@buffet.sh)
2022-10-28 22:32:52 +0000 <dminuoso> cpli: So yeah I guess thats the real answer. Keep a single TChan and have all write into that, and then each backend would have a dupTChan'ed or newBroadcastTChan'ed reader.
2022-10-28 22:33:00 +0000 <dsal> I've never had to care about a particular ordering of channel ops, so I've not thought too much about avoiding having one get behind. One approach might be to atomically read from multiple and make a decision as to which one you want based on data inside.
2022-10-28 22:33:23 +0000 <dminuoso> cpli: (so the merging happens by fact of just writing into a single TChan)
2022-10-28 22:33:37 +0000 <dsal> Yeah, that's a lot easier. :)
2022-10-28 22:33:41 +0000 <monochrom> Right? "Is c2 really ready earlier?" is just philosophy. The computer science question is "if empirically you get Right, can we restrospectively make up a story that says c2 is ready earlier?" and the answer is yes.
2022-10-28 22:33:57 +0000polo(~polo@user/polo)
2022-10-28 22:34:42 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 22:34:52 +0000 <dsal> I've got into a lot of arguments with people who just want to overwrite the state with "whatever happened last" and it's really hard to explain to people how that doesn't work.
2022-10-28 22:34:59 +0000 <dminuoso> cpli: more to the point, set up that `TChan Event` with newBroadcastTChan (instead of newTChan) and then dupChan it for every backend. :)
2022-10-28 22:35:25 +0000 <dminuoso> dsal: You can just fling an IORef around!
2022-10-28 22:35:53 +0000 <dminuoso> And to silence any arguments, unsafeIOtoSTM all evil operations and do this in STM for maximum confusion.
2022-10-28 22:36:01 +0000 <dsal> A guy on my team once made a model of our system that let someone single step through every decision with business folks nodding that it was doing what they want and then get to the last bit and it all falls apart and they just assume it's a bug that needs to be fixed.
2022-10-28 22:37:01 +0000 <dsal> You could always have a PNRG in your STM state and change the ordering along the way.
2022-10-28 22:37:24 +0000pyrex(~pyrex@user/pyrex)
2022-10-28 22:39:17 +0000 <dminuoso> Why settle for a PRNG?
2022-10-28 22:39:31 +0000 <dminuoso> unsafeIOtoSTM that quantum RNG :)
2022-10-28 22:39:38 +0000 <monochrom> Haha
2022-10-28 22:39:48 +0000 <cpli> dsal: not enough code
2022-10-28 22:39:49 +0000 <cpli> run :: [Backend] → IO ()
2022-10-28 22:39:50 +0000 <cpli> run bs = let
2022-10-28 22:39:50 +0000 <cpli> withChannel :: [(Chan Event, Backend)]
2022-10-28 22:39:50 +0000 <cpli> withChannel = (newChan,) <$> bs
2022-10-28 22:39:50 +0000 <cpli> -- what would i do here, such that
2022-10-28 22:39:50 +0000 <cpli> -- bn <- bm where N /= M
2022-10-28 22:39:50 +0000 <cpli> in mapConcurrently_ (uncurry runBackend) withChannel
2022-10-28 22:39:51 +0000 <cpli> runBackend :: Chan Event → Backend → IO ()
2022-10-28 22:39:51 +0000 <cpli> runBackend ch (B1 b) = runB1 ch b
2022-10-28 22:39:52 +0000 <cpli> runBackend ch (B2 b) = runB2 ch b
2022-10-28 22:39:52 +0000 <cpli> -- ...
2022-10-28 22:40:48 +0000 <cpli> dminuoso: if i simply `dupChan` then every backend needs to take `N-1` reading channels from all the other backends
2022-10-28 22:41:00 +0000 <dminuoso> cpli: No, you seem to misunderstand.
2022-10-28 22:41:01 +0000 <monochrom> That may break the Copenhagen interpretation >:)
2022-10-28 22:41:04 +0000TonyStone(~TonyStone@cpe-74-76-51-197.nycap.res.rr.com)
2022-10-28 22:41:33 +0000 <dminuoso> cpli: First you start with one writer TChan, set it up with newBroadcastTChan (this is important!), this will get passed along to every backend.
2022-10-28 22:41:47 +0000 <cpli> understood.
2022-10-28 22:41:54 +0000 <dminuoso> cpli: Then, for every backend, you provide a dupTChan of that original chan, which will - for each backend - be a reader.
2022-10-28 22:42:23 +0000 <dminuoso> s/for each backend/for each respective backend/
2022-10-28 22:43:04 +0000 <dminuoso> So if you want to broadcast, you write to that first writer tchan, and to listen to events you just read from that local reader tchan
2022-10-28 22:43:52 +0000 <dminuoso> so each backend has exactly one writer and one reader channel
2022-10-28 22:48:35 +0000 <cpli> and if i `runBackend1 :: Chan Event → Backend1 → IO ()
2022-10-28 22:48:35 +0000 <cpli> runBackend1 ch b = race (async (readChan ch)) awaitBackendEvent
2022-10-28 22:48:49 +0000 <cpli> sorry for formatting
2022-10-28 22:49:07 +0000 <cpli> that code isn't really done
2022-10-28 22:49:23 +0000 <cpli> the idea is that events from the backend are then written into the channel again
2022-10-28 22:50:27 +0000 <cpli> more akin to:
2022-10-28 22:50:27 +0000 <cpli> runBackend1 :: Chan Event → Backend1 → IO ()
2022-10-28 22:50:27 +0000 <cpli> runBackend1 ch b = forever $ race (readChan ch)
2022-10-28 22:50:27 +0000 <cpli> (writeChan ch =<< awaitBackendEvent)
2022-10-28 22:51:31 +0000 <cpli> or in your case dminuoso:
2022-10-28 22:51:33 +0000 <cpli> runBackend1 :: Chan Event → Chan Event → Backend1 → IO ()
2022-10-28 22:51:33 +0000 <cpli> runBackend1 wch rch b = forever $ race (readChan rch)
2022-10-28 22:51:33 +0000 <cpli> (writeChan wch =<< awaitBackendEvent)
2022-10-28 22:52:04 +0000 <dminuoso> That looks a bit strange
2022-10-28 22:52:17 +0000 <dminuoso> Is the `rch` another channel?
2022-10-28 22:52:21 +0000 <cpli> don't `Event`s from `wch` don't simply end up back in `rch`?
2022-10-28 22:52:35 +0000 <dminuoso> Sure, you need to filter them out.
2022-10-28 22:52:42 +0000 <cpli> and `unGet` them?
2022-10-28 22:53:19 +0000 <dminuoso> No, you just read them again.
2022-10-28 22:53:36 +0000 <cpli> oh true
2022-10-28 22:53:41 +0000 <cpli> sure
2022-10-28 22:53:55 +0000 <cpli> kind of a hassle to have to
2022-10-28 22:54:17 +0000 <cpli> but the events are sure to arrive at the other threads nonetheless
2022-10-28 22:54:31 +0000 <dminuoso> Of course, that's what dupTChan is for
2022-10-28 22:54:43 +0000 <dminuoso> It lets you set up broadcast semantics exactly like that
2022-10-28 22:54:53 +0000polo(~polo@user/polo) (Ping timeout: 276 seconds)
2022-10-28 22:56:32 +0000 <cpli> the entire idea with "fuse" would've been to do what you meant, i.e. to `newBroadcastTChan` then `dupTChan` until you'd have a list of "RChan"s from all *other backends* and fuse those together to create a `Chan` for `bn` which would only recieve all events from `bm` where `n /= m`
2022-10-28 22:56:54 +0000 <cpli> but i guess just filtering out your own events is simpler
2022-10-28 22:57:12 +0000 <dminuoso> Yup, it doesnt need a n helper threads to set up
2022-10-28 22:57:36 +0000 <dminuoso> or I guess just a singular dispatcher thread
2022-10-28 22:57:38 +0000 <cpli> probably possible to solve in data, no?
2022-10-28 22:58:15 +0000 <dminuoso> I would only pursue the dispatcher model if you had more unicast semantics
2022-10-28 22:58:20 +0000 <dminuoso> but if everything is broadcast, this is the simpler way
2022-10-28 22:58:37 +0000 <dminuoso> cpli: Also, this model preserves event order properly
2022-10-28 22:58:47 +0000 <dminuoso> your other approach does not
2022-10-28 22:59:03 +0000 <cpli> *would* not, since it doesn't seem to exist
2022-10-28 22:59:14 +0000 <dminuoso> of course it does.
2022-10-28 22:59:24 +0000nek0(~nek0@2a01:4f8:222:2b41::12)
2022-10-28 22:59:25 +0000 <dminuoso> its preserved in the order of which elements are read out
2022-10-28 23:00:05 +0000 <dminuoso> I mean yeah, ultimately you could still have write problems if there's any coordination/communication between the backends with retries going on
2022-10-28 23:00:11 +0000 <cpli> would an optimization be to include the read in the write case? i.e. immediately read after writing to the `Chan- i don't have guarantees about my event being next ever..
2022-10-28 23:00:30 +0000 <dminuoso> What do you mean "to include the read in the write case"?
2022-10-28 23:00:46 +0000 <dsal> No, if you want to ignore particular messages, you have to ignore the particular messages. You can't rely on timing.
2022-10-28 23:01:34 +0000 <dminuoso> Oh you mean as a means to consume the element you have just written?
2022-10-28 23:02:37 +0000 <cpli> `bn` writes to `wch` and read from `rch`, `bm` will recieve the event, but `bn` also *will* recieve its own message, `bn` wouldn't need to read its message in its "read thread" if it could immediately could remove the message from `rch`
2022-10-28 23:02:42 +0000 <cpli> but there's no guarantee
2022-10-28 23:03:00 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:f81b:3b92:bbe7:93b6) (Remote host closed the connection)
2022-10-28 23:03:33 +0000 <cpli> also `rch` could be clogged up anyway, with 15 events "in queue" in which case the event pushed to `wch` wouldn't be the next in line anyways
2022-10-28 23:03:41 +0000 <dminuoso> cpli: https://gist.github.com/dminuoso/f42f92a27457088ce0d927175d7a21fc
2022-10-28 23:03:43 +0000 <dminuoso> Something along these lines
2022-10-28 23:03:55 +0000danza(~francesco@151.68.150.173) (Ping timeout: 272 seconds)
2022-10-28 23:04:34 +0000 <dminuoso> cpli: oh hold on by the way, we dont even need two separate TChans!
2022-10-28 23:04:43 +0000 <dminuoso> Just the dupTChan'ed channel will serve both!
2022-10-28 23:04:48 +0000 <dminuoso> simplifying things even further.
2022-10-28 23:05:50 +0000 <cpli> `atomically` such that no events may be written to the channels whilst initializing them?
2022-10-28 23:06:58 +0000 <dminuoso> cpli: No, its just that newBroadcastTChan must occur inside STM.
2022-10-28 23:07:00 +0000 <dminuoso> And dupTChan
2022-10-28 23:07:38 +0000 <cpli> what stops this from being non-STM, multithreading?
2022-10-28 23:08:02 +0000 <dminuoso> cpli: Ive updated the gist, feel free to reload
2022-10-28 23:08:35 +0000 <dminuoso> cpli: TChan is an STM data structure.
2022-10-28 23:08:56 +0000 <dminuoso> You dont have to use STM everywhere, just in the few parts where you interact with it.
2022-10-28 23:08:59 +0000redmp(~redmp@eduroam-169-233-187-108.ucsc.edu) (Ping timeout: 272 seconds)
2022-10-28 23:10:33 +0000j4cc3b(~j4cc3b@pool-74-105-2-138.nwrknj.fios.verizon.net)
2022-10-28 23:10:49 +0000 <cpli> "TChan", "STM.TChan". yes, and multithreading requires STM, I assume
2022-10-28 23:11:00 +0000 <dminuoso> No, we have threads without STM just fine.
2022-10-28 23:11:11 +0000 <dminuoso> STM is just the basis for most our synchronization tools.
2022-10-28 23:11:23 +0000 <dminuoso> Think of STM as setting up transactions around critical sections.
2022-10-28 23:11:55 +0000ChaiTRex(~ChaiTRex@user/chaitrex) (Remote host closed the connection)
2022-10-28 23:12:00 +0000 <dminuoso> or well, avoiding the need for critical sections, even.
2022-10-28 23:12:32 +0000 <dminuoso> cpli: Basically we have two things at our disposal: We have MVar and STM
2022-10-28 23:12:34 +0000ChaiTRex(~ChaiTRex@user/chaitrex)
2022-10-28 23:13:46 +0000 <dminuoso> Both can help with synchronizing multiple threads. MVar is a really low level primitive that you can build higher primitives around (say like a semaphore), whereas STM is a potent high level framework (its not based on MVar, though)
2022-10-28 23:13:54 +0000 <cpli> oh this is actually way cooler than i expected
2022-10-28 23:14:18 +0000 <cpli> i require awaitEvent :: _ -> IO Event
2022-10-28 23:14:29 +0000 <cpli> actually no
2022-10-28 23:14:49 +0000 <dminuoso> Sure, just wrap the body in `atomically` then you can make it `IO Event`
2022-10-28 23:14:57 +0000 <cpli> this may await an event from `b1` indefinitely
2022-10-28 23:15:12 +0000 <dminuoso> Either would
2022-10-28 23:15:12 +0000 <cpli> whilst `b2` is broadcasting
2022-10-28 23:15:33 +0000 <dminuoso> Why would it?>
2022-10-28 23:16:10 +0000 <cpli> if `b1` recieves an event `FromB1` it creates another `B1Event`
2022-10-28 23:16:36 +0000 <cpli> otherwise `awaitEvent` return the event from `bn`
2022-10-28 23:16:41 +0000Sgeo_(~Sgeo@user/sgeo)
2022-10-28 23:16:41 +0000 <dminuoso> Well, each backend will likely have to run two separate threads, yes.
2022-10-28 23:16:42 +0000danza(~francesco@151.35.98.197)
2022-10-28 23:16:58 +0000 <cpli> and `race` with Control.Concurrent
2022-10-28 23:17:03 +0000 <dminuoso> Or you have some kind of event loop and use tryReadTChan instead
2022-10-28 23:17:49 +0000 <cpli> i think for each backend to either be:
2022-10-28 23:17:55 +0000 <cpli> 1. broadcasting its own event
2022-10-28 23:18:07 +0000 <cpli> 2. processing an event it recieved
2022-10-28 23:18:11 +0000 <cpli> is relatively elgant
2022-10-28 23:18:39 +0000cplithinks their typos probably aren't exactly elegant
2022-10-28 23:19:27 +0000jmorris(uid537181@id-537181.uxbridge.irccloud.com)
2022-10-28 23:19:53 +0000 <dminuoso> cpli: Updated gist
2022-10-28 23:20:04 +0000Sgeo(~Sgeo@user/sgeo) (Ping timeout: 250 seconds)
2022-10-28 23:20:34 +0000 <dminuoso> Whether a simple `runBackend b = forever $ do r <- tryAwaitEvent ...` or STM variant instead makes more sense, depends on what you want to do exactly
2022-10-28 23:20:49 +0000eggplantade(~Eggplanta@2600:1700:38c5:d800:5147:575b:dd93:ff03)
2022-10-28 23:21:09 +0000 <dminuoso> Also think ahead about things like termination
2022-10-28 23:21:19 +0000 <dminuoso> Might want to include some kind of signaling layer in the event stream
2022-10-28 23:21:38 +0000 <dminuoso> Such that the worker can just stop gracefully, perhaps release resources
2022-10-28 23:21:59 +0000 <cpli> doesn't `TMChan` solve such a scenario?
2022-10-28 23:22:35 +0000 <dminuoso> Sure, if you fancy that.
2022-10-28 23:22:39 +0000 <dminuoso> I would probably just roll my own
2022-10-28 23:23:01 +0000 <cpli> i have to admit i don't know why you're checking if eventTag e == backendTag (bwcBackend b)
2022-10-28 23:23:11 +0000 <dminuoso> Writing such thing on the spot takes little effort and it helps keep dependency footprints small. And it lets you model your combinators the way you need to.
2022-10-28 23:23:24 +0000 <cpli> if it recieves a message from itself it tries agai-
2022-10-28 23:23:27 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-10-28 23:23:28 +0000 <cpli> makes sense.
2022-10-28 23:24:29 +0000adanwan(~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 258 seconds)
2022-10-28 23:24:43 +0000 <dminuoso> cpli: For elaborate things, you may have to spawn two thread for each backend, potentially with TQueues or things between them for coordinations.
2022-10-28 23:25:00 +0000 <dminuoso> This is all just different options, without knowing what these backends really do its hard to tell
2022-10-28 23:25:01 +0000 <cpli> dminuoso the backends both come from relatively large dependencies, i've come this far only by scouting stackage for package versions that don't clash on their version of `ByteString` and downgrading from ghc 9.4.2 to 9.0.2
2022-10-28 23:25:15 +0000ChaiTRex(~ChaiTRex@user/chaitrex) (Ping timeout: 258 seconds)
2022-10-28 23:25:42 +0000 <cpli> they're xmpp and irc
2022-10-28 23:25:47 +0000 <cpli> i'm writing a bridge.
2022-10-28 23:25:53 +0000 <cpli> cat's out the bag
2022-10-28 23:26:04 +0000 <dminuoso> So there's just two backends then?
2022-10-28 23:26:11 +0000 <cpli> well, extensibility
2022-10-28 23:26:21 +0000 <dminuoso> As a kind of star bridge?
2022-10-28 23:26:36 +0000 <cpli> currently my dhall config only lets you specify bots for either backend, but yes, a star bridge
2022-10-28 23:26:44 +0000 <cpli> plans for discord etc
2022-10-28 23:27:11 +0000 <cpli> the thing i want to implement really is proper puppeteering for irc
2022-10-28 23:27:13 +0000 <dminuoso> cpli: I think I would just spawn two threads for each backend.
2022-10-28 23:27:20 +0000 <cpli> exaclty
2022-10-28 23:27:27 +0000 <cpli> s/cl/lc/
2022-10-28 23:27:28 +0000ChaiTRex(~ChaiTRex@user/chaitrex)
2022-10-28 23:27:38 +0000 <dminuoso> Haskell threads are really cheap, so go wild with them.
2022-10-28 23:27:45 +0000 <cpli> they are?
2022-10-28 23:27:53 +0000 <dminuoso> Yes, they are green threads.
2022-10-28 23:28:32 +0000 <cpli> haskell knew of that color before go's implementation?
2022-10-28 23:28:37 +0000merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 272 seconds)
2022-10-28 23:29:01 +0000 <dminuoso> Honestly I dont know of the ethymology. :)
2022-10-28 23:29:18 +0000 <dminuoso> Sorry I should refine. *GHC threads cheap
2022-10-28 23:29:46 +0000 <cpli> it has something to do with async, where threads are coloured red or blue, and state needs to stay in one color
2022-10-28 23:29:55 +0000 <cpli> but green sits on top ignoring all of that
2022-10-28 23:30:07 +0000 <dminuoso> Im almost confident that the name is older than go.
2022-10-28 23:30:46 +0000 <cpli> yup 1997: "Green threads refers to the name of the original thread library for the programming language Java (that was released in version 1.1 and then Green threads were abandoned in version 1.3 to native threads). It was designed by The Green Team at Sun Microsystems."
2022-10-28 23:30:56 +0000 <cpli> from wikipedia the *free* encyclopedia
2022-10-28 23:31:00 +0000 <dminuoso> https://web.archive.org/web/20080530073139/http://java.sun.com/features/1998/05/birthday.html
2022-10-28 23:31:06 +0000 <dminuoso> Well I prefer citing the primary source. :)
2022-10-28 23:31:20 +0000mvk(~mvk@2607:fea8:5ce3:8500::f30b) (Ping timeout: 250 seconds)
2022-10-28 23:31:48 +0000 <cpli> find on page: "green threads" 0/0 results
2022-10-28 23:31:52 +0000 <dminuoso> Heh its funny, isnt it.
2022-10-28 23:32:01 +0000 <dminuoso> Quality control at its finest
2022-10-28 23:32:37 +0000 <dminuoso> cpli: the cool thing about the way things are implemented in haskell, is that you get the best of all worlds combined.
2022-10-28 23:32:59 +0000thyriaen(~thyriaen@2a01:aea0:dd4:470d:6245:cbff:fe9f:48b1) (Remote host closed the connection)
2022-10-28 23:32:59 +0000thyriaen_(~thyriaen@2a01:aea0:dd4:470d:6245:cbff:fe9f:48b1) (Remote host closed the connection)
2022-10-28 23:33:29 +0000 <dminuoso> You can just use blocking IO in threads, and the RTS will be aware of that, use non-blockin IO behind the scenes, schedule threads when data is available again
2022-10-28 23:33:44 +0000 <dminuoso> And you still get parallelism since GHC can use multiple capabilities
2022-10-28 23:33:53 +0000raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 276 seconds)
2022-10-28 23:33:55 +0000 <jbggs[m]> I thought red/blue functions was a different thing from green threads
2022-10-28 23:34:16 +0000 <dminuoso> And when I say Haskell, I really mean GHC Haskell.
2022-10-28 23:34:34 +0000 <cpli> systemFω here to save the day
2022-10-28 23:35:03 +0000 <jbggs[m]> i.e. red functions are async functions, which in many languages are run on green threads
2022-10-28 23:35:21 +0000 <cpli> jbggs[m]: i apologise, i relay uncited information.
2022-10-28 23:35:35 +0000 <jbggs[m]> or at least can be
2022-10-28 23:35:59 +0000 <monochrom> amd functions, intel functions, and nvidia threads? >:)
2022-10-28 23:36:04 +0000 <cpli> dminuoso: this is the haskell irc, before i denounce things without thought
2022-10-28 23:36:13 +0000 <cpli> do people here use compilers other than ghc?
2022-10-28 23:36:21 +0000 <dminuoso> monochrom: If you want crazy terminology, look at ARINC 653.
2022-10-28 23:36:55 +0000 <jbggs[m]> I think it's interesting that people are prone to thinking of these things with colors
2022-10-28 23:36:56 +0000 <jbggs[m]> cpli: no harm no foul :D
2022-10-28 23:37:11 +0000 <dminuoso> They contort established terminology to the point where they will sell you a "list" as an "OS process" (slightly exaggerating, but not by much)
2022-10-28 23:37:25 +0000 <monochrom> Oh there are people who listen to music and see colours, too.
2022-10-28 23:37:26 +0000mixfix41(~sdeny9ee@user/mixfix41) (Ping timeout: 260 seconds)
2022-10-28 23:37:40 +0000 <jbggs[m]> I mean they're both functors right :V
2022-10-28 23:37:50 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg) (Ping timeout: 250 seconds)
2022-10-28 23:38:08 +0000 <jbggs[m]> lists and OS processes i mean
2022-10-28 23:38:12 +0000gurkenglas(~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 264 seconds)
2022-10-28 23:38:18 +0000 <cpli> jbggs[m]: smells like 2-cats
2022-10-28 23:38:45 +0000 <cpli> sorry, i meant 2d operads
2022-10-28 23:38:49 +0000 <jbggs[m]> 2-cats?
2022-10-28 23:39:11 +0000 <EvanR> cpli, within the atomically, it's like there are no other threads or they don't do anything that matters. So you read what you just wrote. If anything would have happened to change that, the atomically doesn't happen (retry)
2022-10-28 23:39:54 +0000 <dminuoso> *semantically
2022-10-28 23:39:56 +0000 <jbggs[m]> That's a new word for me, operad
2022-10-28 23:39:58 +0000 <cpli> EvanR, if i remember anything correctly STM basically locks for any other thread trying to access the same memory region
2022-10-28 23:40:05 +0000 <dminuoso> cpli: No.
2022-10-28 23:40:08 +0000 <cpli> q-q
2022-10-28 23:40:08 +0000 <dminuoso> cpli: its lock-free.
2022-10-28 23:40:11 +0000 <cpli> q-q
2022-10-28 23:40:16 +0000cpliin awe
2022-10-28 23:40:26 +0000 <EvanR> locking sounds like an implementation thing, which it doesn't use but really shouldn't matter to this story
2022-10-28 23:40:29 +0000 <cpli> wait-free too?
2022-10-28 23:40:38 +0000 <monochrom> Well, I'm fine with a suitable definition of "basically".
2022-10-28 23:41:21 +0000 <EvanR> one slow implementation strategy is to run all STM actions sequentially, perhaps using a shared global lock
2022-10-28 23:42:03 +0000 <monochrom> Basically, if you only notice final answers and don't notice speed, STM gives the same answer as locking.
2022-10-28 23:42:18 +0000lisbeths(uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2022-10-28 23:42:28 +0000perrierjouet(~perrier-j@modemcable048.127-56-74.mc.videotron.ca)
2022-10-28 23:42:39 +0000 <monochrom> If you pay attention to speed, STM is sometimes faster than locking, sometimes slower.
2022-10-28 23:42:42 +0000 <cpli> jbggs[m]: "cats" or categories, 2-cats are cats with 0-cells (your normal objects) 1-cells (arrows between your objects) and arrows between your objects etc. operads are a way to represent cells, which is another matter
2022-10-28 23:43:22 +0000 <EvanR> do operads have anything to do with monads
2022-10-28 23:43:38 +0000 <monochrom> Although, the sad thing is that the very word "transactional" in the very name has already told you how it does it, but people have never learned transactions, they have only learned locking.
2022-10-28 23:43:53 +0000 <cpli> not necessarily, but also yes, unless they don't EvanR
2022-10-28 23:44:18 +0000 <EvanR> that's the worst bit of category theory ever
2022-10-28 23:45:16 +0000 <cpli> operads are just shapes that give you some way of "glueing" them together to get new shapes
2022-10-28 23:45:31 +0000 <cpli> i.e. composition if you think of the edges of your shapes as arrows
2022-10-28 23:45:52 +0000 <cpli> i.e. glueing from topology if you get really weird
2022-10-28 23:46:00 +0000polo(~polo@user/polo)
2022-10-28 23:46:06 +0000 <cpli> i.e. homotopies if you haven't slept for 2 weeks
2022-10-28 23:46:45 +0000 <talismanick> monochrom: "If you want to write CS research today, look at what the database people were doing 2 decades ago"
2022-10-28 23:46:56 +0000 <cpli> monochrom, what does transactional entail?
2022-10-28 23:47:00 +0000 <talismanick> I forget who said that, but the more I read, the more it rings true...
2022-10-28 23:47:12 +0000 <EvanR> what database people other than mysql was doing 2 decades ago
2022-10-28 23:47:13 +0000 <cpli> i.e. "ownership" in rust terms is always handed along?
2022-10-28 23:47:22 +0000 <talismanick> cpli: ACIDity
2022-10-28 23:47:41 +0000 <EvanR> the I in ACID corresponds to transactional
2022-10-28 23:47:50 +0000 <cpli> of course it does
2022-10-28 23:47:56 +0000 <monochrom> Learn "database transactions". If you don't see "roll back" you aren't learning transactions.
2022-10-28 23:48:01 +0000polo(~polo@user/polo) (Client Quit)
2022-10-28 23:48:02 +0000Tuplanolla(~Tuplanoll@91-159-69-11.elisa-laajakaista.fi) (Quit: Leaving.)
2022-10-28 23:48:16 +0000 <dminuoso> Gosh, did Microsoft really remove SPJs papers website? :(
2022-10-28 23:48:18 +0000 <talismanick> Or, at least, the A and I parts - C is up to the programmer, and D is outside the scope of STM
2022-10-28 23:48:28 +0000 <dminuoso> I wish hyperlinks would just stay alive...
2022-10-28 23:48:38 +0000 <EvanR> i was downloading spj papers from microsoft a couple weeks ago
2022-10-28 23:48:56 +0000 <cpli> oh
2022-10-28 23:49:22 +0000 <monochrom> I think https://simon.peytonjones.org/publications/ helps.
2022-10-28 23:49:41 +0000 <cpli> start doing x, do x in y, if x fails, restore y
2022-10-28 23:50:02 +0000 <EvanR> begin transaction; do whatever, do whatever, do whatever, commit
2022-10-28 23:50:31 +0000 <cpli> or record y, do f, if f fails, restore y and override g's operation on y
2022-10-28 23:50:32 +0000 <EvanR> let the database figure out how to interleave it all
2022-10-28 23:50:55 +0000 <EvanR> while maintaining the invariants
2022-10-28 23:51:24 +0000 <cpli> i guess `I` ruins my joke
2022-10-28 23:51:44 +0000 <dminuoso> cpli: Anyway, the way GHC implements STM, is by just running the transactional code without any lock, along the way it records a transaction log of what it has does, and if at the end the log is consistent it will commit that to memory.
2022-10-28 23:51:49 +0000 <cpli> how do you guarantee `I` on non-hardware-atomics?
2022-10-28 23:51:55 +0000 <cpli> i.e. entire memory regions?
2022-10-28 23:52:30 +0000 <dminuoso> And if it doesnt, it can retry that block. Given that it has a transactional log, it can then block until it *knows* that a dependent variable has changed (no need to retry if none of the read variables havent changed)
2022-10-28 23:53:03 +0000 <cpli> dminuoso, oh, it's the weird "transform any algorithm into a wait-free algorithm vm"
2022-10-28 23:53:21 +0000 <dminuoso> I do not know that transformation
2022-10-28 23:53:30 +0000 <cpli> no?
2022-10-28 23:53:34 +0000 <cpli> one-moment
2022-10-28 23:53:48 +0000 <EvanR> what would wait free mean in this context
2022-10-28 23:54:06 +0000 <monochrom> I know lock-free, I don't know wait-free.
2022-10-28 23:54:08 +0000 <cpli> http://cs.technion.ac.il/~erez/Papers/wf-simulation-full.pdf
2022-10-28 23:54:16 +0000 <cpli> wait, this turns lock-free into wait-free
2022-10-28 23:54:22 +0000 <cpli> dammit
2022-10-28 23:54:25 +0000 <monochrom> Wouldn't it be nice if vaccination clinics were wait-free >:)
2022-10-28 23:54:41 +0000chomwitt(~chomwitt@2a02:587:dc10:8200:1ac0:4dff:fedb:a3f1) (Ping timeout: 276 seconds)
2022-10-28 23:55:14 +0000 <dminuoso> monochrom: They can be, just start coughing enough and ask loudly-but-not-too-loudly for the vaccination against your hot COVID infection.
2022-10-28 23:55:22 +0000 <talismanick> cpli: so, wait-free means no live locks... ?
2022-10-28 23:56:15 +0000 <cpli> wait-free is pseudo termination-guarantees
2022-10-28 23:56:32 +0000adanwan(~adanwan@gateway/tor-sasl/adanwan)
2022-10-28 23:56:32 +0000 <monochrom> I think they would immediately send you home instead. But hey, "abort early, abort often" is more wait-free than "wait then abort anyway".
2022-10-28 23:56:32 +0000 <dminuoso> cpli: Im not sure this really compares. One of the crucial things is that if the view of memory is not consistent (which it might be), it will retry.
2022-10-28 23:57:09 +0000 <cpli> talismanick: `push` **will succeed** in n cpu-cycles
2022-10-28 23:57:50 +0000 <cpli> dminuoso: how do you ensure termination? i.e. stop the vm from retrying indefinitely?
2022-10-28 23:58:05 +0000freeside(~mengwong@bb115-66-48-84.singnet.com.sg)
2022-10-28 23:58:29 +0000 <dminuoso> cpli: two things: a) since a transaction log is kept, you can only retry when there's a possibility of obtaining a different result
2022-10-28 23:58:42 +0000 <monochrom> In usage of STM we just ask for fairness, I think.
2022-10-28 23:58:50 +0000 <cpli> dminuoso: interesting.
2022-10-28 23:58:52 +0000 <dminuoso> b) just some optimism that concurrency is not crazy wild I suppose?
2022-10-28 23:59:00 +0000euandreh(~euandreh@179.214.113.107)
2022-10-28 23:59:05 +0000 <cpli> B)
2022-10-28 23:59:13 +0000 <talismanick> aaaaah, so it's the opposite of what I said - no deadlocks , but can have livelocks (each part succeeds in allotted time without being starved externally, but end up ping-pong'ing each other and cause the system to make no progress)
2022-10-28 23:59:13 +0000 <dminuoso> I mean yeah, if you keep extremely large transactions, retrying will get more expensive
2022-10-28 23:59:22 +0000azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 258 seconds)
2022-10-28 23:59:46 +0000 <talismanick> interesting