2022/02/12

2022-02-12 00:01:24 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 276 seconds)
2022-02-12 00:01:32 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-02-12 00:04:11 +0100mikoto-chan(~mikoto-ch@213.177.151.239) (Ping timeout: 256 seconds)
2022-02-12 00:07:05 +0100Guest|11(~Guest|11@96.63.212.186) (Quit: Connection closed)
2022-02-12 00:07:23 +0100Pickchea(~private@user/pickchea) (Quit: Leaving)
2022-02-12 00:08:31 +0100vysn(~vysn@user/vysn)
2022-02-12 00:09:19 +0100alx741(~alx741@157.100.197.240)
2022-02-12 00:13:03 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net)
2022-02-12 00:13:24 +0100 <hololeap> I'm still not great at reasoning about lazy/strict evaluation and how it influences space/time metrics
2022-02-12 00:13:36 +0100 <hololeap> but it seems like comonads are especially difficult to reason about
2022-02-12 00:14:39 +0100 <hololeap> if you set up a cellular automata simulation that's modeled with the store comonad, the naive implementation seems to have something like O(2^n) time for each step of the simulation
2022-02-12 00:15:33 +0100 <hololeap> but if you set it up with a Representable array backend you don't have this problem. I'm still confused as to why
2022-02-12 00:17:41 +0100 <hololeap> [1] https://hackage.haskell.org/package/adjunctions-4.4/docs/Control-Comonad-Representable-Store.html
2022-02-12 00:17:46 +0100 <hololeap> [2] https://hackage.haskell.org/package/vector-sized-1.5.0/docs/Data-Vector-Generic-Sized.html#t:Repre…
2022-02-12 00:20:16 +0100bontaq(~user@ool-45779fe5.dyn.optonline.net)
2022-02-12 00:21:35 +0100azimut_(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-02-12 00:21:50 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-02-12 00:22:08 +0100 <monochrom> If it's as bad as 2^n time, it may be unrelated to laziness or eagerness. More like redundant recursion.
2022-02-12 00:22:56 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 00:23:19 +0100 <monochrom> For example changing "f(n) = let y = f(n-1) in y+y" to "f(n) = f(n-1) + f(n-1)" is a simple way to turn n-time into 2^n-time. This holds for both lazy and eager evaluation.
2022-02-12 00:24:02 +0100 <Rembane> Is Representable perhaps doing memoization for you? I'm just guessing here.
2022-02-12 00:24:54 +0100 <monochrom> Yeah "array backend" begins to sound like automatic dynamic-programming-ization, but I haven't learned comonad or store.
2022-02-12 00:25:42 +0100 <monochrom> But it corroborates with 2^n -> n like my example.
2022-02-12 00:26:41 +0100 <hololeap> yeah it's storing each step to the vector with [1]. I think this does have something to do with strictness, though, since if it wasn't *actually* storing to the vector but just building up thunks saying to do so later, wouldn't I run into the same 2^n-time problem as before?
2022-02-12 00:26:57 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net) (Ping timeout: 240 seconds)
2022-02-12 00:27:03 +0100 <dolio> I don't think it has anything to do with strictness.
2022-02-12 00:27:06 +0100 <geekosaur> not necessarily, it'd just do the O(n) late
2022-02-12 00:27:12 +0100 <dolio> It has to do with functions being a bad implementation of arrays.
2022-02-12 00:27:22 +0100 <hololeap> ok
2022-02-12 00:27:35 +0100 <hololeap> so this is somewhat specific to the store comonad
2022-02-12 00:27:54 +0100 <hololeap> since Store s a = (s -> a, s)
2022-02-12 00:28:39 +0100 <hololeap> if it memoizes between each mutation you get the same semantics but much better time
2022-02-12 00:28:50 +0100 <dolio> Yes, all the work done by the function is not shared across separate invocations of the function with the same input.
2022-02-12 00:29:31 +0100 <dolio> And every time you split, you introduce a new dimension for work to avoid being shared.
2022-02-12 00:30:11 +0100 <hololeap> oh... this sounds like it could be related to linear types
2022-02-12 00:30:52 +0100 <hololeap> like you could have some automatic memoization thing using linear types... I'm also not very familiar with linear types :p
2022-02-12 00:32:29 +0100slowtype-(~slowtyper@46.12.42.68.dsl.dyn.forthnet.gr) (Ping timeout: 250 seconds)
2022-02-12 00:32:33 +0100 <hololeap> I guess my other question is if you run `extend` on this Store implementation from adjunctions, would there be some intermediate moment where you would have effectively squared the memory requirements of your vector?
2022-02-12 00:33:05 +0100 <hololeap> since it just uses the default definition of `extend f = fmap f . duplicate`
2022-02-12 00:33:06 +0100slowtyper(~slowtyper@user/slowtyper)
2022-02-12 00:33:27 +0100 <hololeap> and duplicate on a 100x100 vector would be 10,000 100x100 vectors
2022-02-12 00:33:35 +0100 <hololeap> unless laziness somehow saves the day here
2022-02-12 00:34:29 +0100 <hololeap> I wouldn't even know how to investigate this if I wanted to
2022-02-12 00:34:30 +0100 <geekosaur> or purity (shared?)
2022-02-12 00:36:28 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 00:37:30 +0100 <dolio> It doesn't seem like the problem is strictness/laziness. It is thinking about references.
2022-02-12 00:37:57 +0100 <hololeap> specifically because I'm talking about vector though...
2022-02-12 00:38:25 +0100 <hololeap> right?
2022-02-12 00:38:45 +0100 <hololeap> if it was a different Representable, it would have to do with strictness/laziness
2022-02-12 00:39:02 +0100 <hololeap> *and then my brain melts*
2022-02-12 00:39:33 +0100DNH(~DNH@2a02:8108:1100:16d8:95db:50d7:7eec:328d) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-02-12 00:40:40 +0100 <monochrom> The Vector you used is likely lazy in elements, only eager in spine.
2022-02-12 00:40:45 +0100 <dolio> If I create an array of length N of arrays of length N of integers, and every element of the outer array is the same array, how much memory does it use?
2022-02-12 00:40:57 +0100alx741(~alx741@157.100.197.240)
2022-02-12 00:41:06 +0100 <hololeap> I have no idea, dolio :)
2022-02-12 00:41:06 +0100slowtype-(~slowtyper@2a02:214c:8494:a100:8f:b3ce:d37b:a68d)
2022-02-12 00:41:43 +0100 <monochrom> Furthermore, I bet per-element laziness is necessary for self-referencing dynamic programming to not become bottom.
2022-02-12 00:41:57 +0100slowtyper(~slowtyper@user/slowtyper) (Ping timeout: 240 seconds)
2022-02-12 00:42:04 +0100 <dminuoso> What are revisions on hackage? Im dabbling around with a nix overrideCabal to swap out a package, but the builder keeps trying to fetch from URIs like http://hackage.haskell.org/package/config-value-0.8.2/revision/1.cabal
2022-02-12 00:42:19 +0100 <dminuoso> Im trying to figure out what they are and why nix is doing this
2022-02-12 00:42:37 +0100 <hololeap> dminuoso: they are what the sound like. revisions to a cabal file that don't warrant a version bump
2022-02-12 00:43:01 +0100 <monochrom> Revisions are post-mortem changes to the *.cabal files so that you don't have to release a new version number just because you change "base < 5" to "base < 6".
2022-02-12 00:43:37 +0100 <monochrom> Therefore, if possible, you should prefer the latest revision.
2022-02-12 00:43:40 +0100 <dminuoso> Is there any example of a package that has revisions on hackage?
2022-02-12 00:43:49 +0100 <hololeap> they also use dos line endings for some reason :D
2022-02-12 00:43:57 +0100 <sclv> when cabal unpacks a package it overrides the cabal file with that of the latest revision
2022-02-12 00:44:40 +0100 <hololeap> dminuoso: there are tons and tons
2022-02-12 00:45:14 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 00:45:19 +0100 <dminuoso> Ahh I see.
2022-02-12 00:45:21 +0100 <dminuoso> https://hackage.haskell.org/package/config-value-0.8.1
2022-02-12 00:45:38 +0100 <dminuoso> Using overrideCabal to just swap out the version is not enough, I gotta remove the revision information
2022-02-12 00:45:54 +0100 <dminuoso> monochrom: thanks, that helped. :)
2022-02-12 00:45:58 +0100 <janus> sclv: can i work on "Rewrite Browse and Search pages for Hackage, implement new ranking" ?
2022-02-12 00:46:15 +0100 <sclv> janus: for gsoc, or just in general? either is welcome!
2022-02-12 00:46:25 +0100 <hololeap> dminuoso: https://github.com/haskell-infra/hackage-trustees/blob/master/revisions-information.md
2022-02-12 00:46:39 +0100jespada(~jespada@87.74.36.188) (Quit: Textual IRC Client: www.textualapp.com)
2022-02-12 00:46:42 +0100 <hololeap> here is an example: https://hackage.haskell.org/package/aeson-1.5.6.0/revisions/
2022-02-12 00:46:44 +0100 <janus> i don't need funding so i don't think it makes sense to apply for gsoc? i want to work on it this weekend and next week
2022-02-12 00:46:57 +0100 <janus> and after that if i don't get done in time, of course
2022-02-12 00:47:02 +0100 <sclv> janus: sounds great!
2022-02-12 00:47:26 +0100 <hololeap> (thanks everyone for the discussion on comonads and strict/lazy. I've got some food for thought)
2022-02-12 00:47:28 +0100 <dminuoso> hololeap: Cheers, thats some helpful insights
2022-02-12 00:47:33 +0100 <sclv> if you want to chat about what the general design is let me know, but I think the tickets hopefully explain the issues well enough.
2022-02-12 00:48:30 +0100 <janus> sclv: well i think the most important thing is to just get it loading quickly while retaining the features, that's what i was imagining
2022-02-12 00:48:40 +0100 <sclv> Basically we just need to make displaying browse faster (by letting it start rendering the first page of the table before All Packages are loaded) and make it more useful by letting people add custom filters, both sticky and otherwise. Generally we probably should just use a more modern tabular data js widget, although ideally not one that relies on dragging in a whole mess of npm
2022-02-12 00:49:05 +0100 <sclv> yeah, just fast loading on its own would be a huge win.
2022-02-12 00:49:11 +0100 <janus> right, i was wondering about the frontend, would it make sense to rewrite it for that page, or is that not permitted?
2022-02-12 00:49:22 +0100 <janus> i was working with PureScript for Exfreight and i liked that
2022-02-12 00:49:24 +0100 <sclv> lots of people have told me they like browse but find its load times make it less useful.
2022-02-12 00:49:35 +0100 <sclv> janus: what do you mean "rewrite it for that page"?
2022-02-12 00:50:04 +0100 <sclv> we only use the tabular data widget in the browse/search interface. everything else is plain tables. i'd be happy to swap in anything that doesn't cause the build to become difficult and fragile.
2022-02-12 00:50:06 +0100 <janus> for example, if it was a purescript frontend that implemented filtering dialogs, paging and such, that is a bit of logic
2022-02-12 00:50:11 +0100asivitz(uid178348@id-178348.tinside.irccloud.com) (Quit: Connection closed for inactivity)
2022-02-12 00:50:44 +0100 <sclv> yeah, i mean i'd rather whatever it is be "a chunk of js code the page includes." dragging a pursecript dep into the hackage build chain seems painful.
2022-02-12 00:51:25 +0100 <janus> ok, so preferrably just plain javascript, i understand
2022-02-12 00:51:28 +0100 <sclv> if there's a not painful way to do it, i'm open, but i would hate to create a situation where people needed to do more than just "run cabal" to build the hackage server
2022-02-12 00:51:43 +0100 <sclv> (and by people, i mean, primarily me. i'm people :-P)
2022-02-12 00:52:03 +0100 <janus> right right, i understand completely
2022-02-12 00:52:19 +0100 <janus> i think i'll start with the backend anyway
2022-02-12 00:52:22 +0100 <janus> ok i'll dig in
2022-02-12 00:52:31 +0100 <sclv> so yeah, just faster is a huge win. i think being able to filter out deprecated stuff would be nice, etc, but its somewhat lower priority.
2022-02-12 00:52:48 +0100 <sclv> also as you dig in you'll probably get your own sense of what features you think would be easy and pleasant too
2022-02-12 00:53:11 +0100 <sclv> (oh i'll also note that the browse/search page is the least mobile friendly of all our pages -- the rest all work pretty nicely)
2022-02-12 00:53:40 +0100 <janus> right
2022-02-12 00:53:42 +0100 <sclv> (but also, presenting large amounts of tabular data on a mobile screen has innate limitations)
2022-02-12 00:53:54 +0100 <hololeap> dminuoso: I don't know if this will help you at all, but this is how I've been dealing with hackage packages with revisions using gentoo: https://github.com/hololeap/gentoo-haskell/blob/master/dev-lang/dhall/dhall-1.40.2.ebuild
2022-02-12 00:55:09 +0100 <hololeap> the key things to take from that are that the .tar.gz from hackage and the .cabal revision need to be downloaded seperately, and I use dos2unix on the revised cabal file just to make patches more consistent
2022-02-12 00:55:15 +0100_________(~nobody@user/noodly) (Ping timeout: 250 seconds)
2022-02-12 00:55:41 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 00:56:19 +0100 <hololeap> (because sometimes I like to patch the revised .cabal file for various reasons)
2022-02-12 00:56:28 +0100_________(~nobody@user/noodly)
2022-02-12 00:57:11 +0100 <dminuoso> hololeap: Its all good. My problem was just that I was overriding an existing nix package whose original version had a revision. So I essentially took a knife and replaced the version, so the builder tried to fetch that same revision but on the new versino
2022-02-12 00:57:25 +0100 <dminuoso> Which failed when trying to fetch that corresponding cabal file from hackage
2022-02-12 00:57:49 +0100 <dminuoso> So I had to not only change the version to 0.8.2, but also reset the revision to null
2022-02-12 00:58:11 +0100 <hololeap> why do they give the .cabal revisions DOS line endings?
2022-02-12 00:58:49 +0100 <geekosaur> probably html line endings that don't get translated?
2022-02-12 00:58:59 +0100 <dminuoso> Fun fact, "unix line endings" used to be CRLF as well.
2022-02-12 00:59:24 +0100 <janus> the LF used to just roll the paper right? and then the CR would return the carraige
2022-02-12 00:59:37 +0100 <janus> so back then, could you even use LFCR and it'd work?
2022-02-12 00:59:43 +0100 <geekosaur> oh, even better. cr cr lf to give the ksr33 time to catch up
2022-02-12 00:59:46 +0100 <dminuoso> janus: Yes.
2022-02-12 00:59:57 +0100marquis_1ndras(~marquis_a@124.170.163.166) (Ping timeout: 240 seconds)
2022-02-12 01:00:03 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 256 seconds)
2022-02-12 01:00:07 +0100 <dminuoso> And you can observe the fact that this went into unix by looking at stty
2022-02-12 01:00:08 +0100 <geekosaur> telnet kept doing that for years
2022-02-12 01:00:11 +0100 <sclv> i don't recall that part of the codebase, but i suspect that its just an artifact of portability. i.e. CRLF might be a pita, but its pretty universally accepted. it could just be an accident, that works well enough nobody bothered to change it too.
2022-02-12 01:00:20 +0100 <dminuoso> By default it expects crlf line endings to represent a newline
2022-02-12 01:00:30 +0100 <dminuoso> You have to manually give it a flag to interpret LF as CRLF
2022-02-12 01:00:33 +0100zeenk(~zeenk@2a02:2f04:a30d:1300:51a3:bcfc:6cda:9fc5) (Quit: Konversation terminated!)
2022-02-12 01:00:58 +0100marquis_andras(~marquis_a@124.170.163.166)
2022-02-12 01:01:10 +0100 <dminuoso> If you dont do that, you just get the line feed and you have stair cases
2022-02-12 01:01:41 +0100 <geekosaur> aka the old "stty raw" problem
2022-02-12 01:02:02 +0100 <hololeap> if the unrevised .cabal files in the tarballs were CRLF, it wouldn't be so annoying, but most people package them as "unix" line endings
2022-02-12 01:02:03 +0100 <dminuoso> Even ASCII adopted to change the name of \n to newline, originally it was named line feed, because at that time quite a few systems adopted this new convention to interpret LF as both CRLF
2022-02-12 01:02:08 +0100alx741(~alx741@157.100.197.240)
2022-02-12 01:02:34 +0100 <hololeap> so I'll get a "different line endings" error from patch after a revision bump
2022-02-12 01:02:36 +0100 <dminuoso> (So this was done to reduce confusiun)
2022-02-12 01:03:32 +0100 <janus> hololeap: this is why i asked about windows textareas. because revisions are made using a textarea
2022-02-12 01:03:41 +0100jgeerds_(~jgeerds@55d4a547.access.ecotel.net) (Ping timeout: 250 seconds)
2022-02-12 01:03:58 +0100 <sclv> hololeap: are _all_ the endings in the revised cabal files crlf, or only some?
2022-02-12 01:04:04 +0100 <sclv> and also all revised cabal files, or only some?
2022-02-12 01:04:14 +0100 <hololeap> all of them
2022-02-12 01:04:31 +0100 <hololeap> however, _most_ but not _all_ of the original cabal files are "unix"
2022-02-12 01:05:04 +0100 <hololeap> I think that just reflects whatever system the maintainer packaged it on
2022-02-12 01:05:27 +0100 <hololeap> and/or wrote it on
2022-02-12 01:06:21 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 01:06:29 +0100 <sclv> If you look at the code, there's nothing that enforces CRLF. it just checks the revised file is an allowed revision (i.e. an allowed change of allowed fields) and then takes whatever it is given: https://github.com/haskell/hackage-server/blob/c40bc16ff221505c6a9cd1099460cf72af56228f/Distributi…
2022-02-12 01:06:30 +0100 <hololeap> > These revisions can be thought of as "updating" the cabal file of a package with new or more current information. However, they do not actually update the file. Tarballs retrieved from Hackage are always as the authors uploaded them. Revision information is tracked explicitly in the Hackage index
2022-02-12 01:07:20 +0100 <sclv> so i imagine it just follows the text conventions of the users' system rather than being as uniform as you imagine
2022-02-12 01:07:53 +0100 <hololeap> hm, why would both cabal and wget consistently convert it to CLRF on my linux system then?
2022-02-12 01:08:06 +0100 <sclv> ah here we go: https://stackoverflow.com/questions/14217101/what-character-represents-a-new-line-in-a-text-area
2022-02-12 01:08:08 +0100 <geekosaur> it seemed pretty reliably crlf to me. I still think it's just using html line endings
2022-02-12 01:08:27 +0100 <sclv> By HTML specifications, browsers are required to canonicalize line breaks in user input to CR LF (\r\n),
2022-02-12 01:09:11 +0100 <sclv> so yeah if someone revises using the web form rather than the api, then we just get the canonicalized line breaks and don't bother to do anything to them
2022-02-12 01:10:09 +0100 <janus> oh interesting, so that would probably mean most revisions have mixed line breaks since there are so many linux users in the haskell space
2022-02-12 01:10:18 +0100 <sclv> i.e. geekosaur is correct and gets the "protocol weirdness" challenge coin
2022-02-12 01:10:29 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-02-12 01:10:52 +0100 <sclv> well i don't think they have mixed breaks, because the browser form will canonicalize everything. so its more the first cabal will have one convention, and all revisions have the other
2022-02-12 01:11:21 +0100 <janus> oh, i interpreted "user input" as only being the actual newlines the user made in the form
2022-02-12 01:11:43 +0100 <janus> i.e. not changing the existing
2022-02-12 01:12:23 +0100 <geekosaur> Ieven remember why they did it. cases like someone entering text into netscape (remember that?) and then someone else viewed it on windows
2022-02-12 01:13:12 +0100 <geekosaur> which was netscape ignoring the spec; for historical reasons all the text-y protocols (html, smtp, ftp, etc.) used crlf
2022-02-12 01:13:33 +0100 <geekosaur> (the historical reason being that tcp/ip was first developed on tenex, not unix)
2022-02-12 01:13:46 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 01:13:46 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 01:13:46 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 01:16:30 +0100chenqisu1(~chenqisu1@183.217.200.249)
2022-02-12 01:17:38 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-02-12 01:20:56 +0100k8yun(~k8yun@user/k8yun) (Ping timeout: 256 seconds)
2022-02-12 01:21:01 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 250 seconds)
2022-02-12 01:24:38 +0100alx741(~alx741@157.100.197.240)
2022-02-12 01:25:01 +0100DNH(~DNH@2a02:8108:1100:16d8:95db:50d7:7eec:328d)
2022-02-12 01:27:05 +0100 <hololeap> huh, maybe it's not as consistant as I thought... strange: https://dpaste.com/C5HMREFMV
2022-02-12 01:27:49 +0100 <hololeap> those were all downloaded with wget from urls like https://hackage.haskell.org/package/aeson-1.5.6.0/revision/5.cabal
2022-02-12 01:28:24 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 01:29:25 +0100alp(~alp@user/alp) (Ping timeout: 240 seconds)
2022-02-12 01:29:41 +0100 <janus> hololeap: from a glance, the revisions look like they all have CRLF. so it is consistent with sclv's claim. (though people aren't necessarily only using the web frontend!)
2022-02-12 01:30:25 +0100 <hololeap> do you get CLRF from that aeson revision I just posted? I don't
2022-02-12 01:30:37 +0100 <hololeap> CRLF
2022-02-12 01:31:18 +0100 <janus> did you make it with the web form?
2022-02-12 01:31:58 +0100 <hololeap> I didn't make it
2022-02-12 01:32:06 +0100 <janus> oh you didn't you make the revision, you were referring to your paste :P
2022-02-12 01:32:20 +0100 <hololeap> yeah I'm just a revision consumer :)
2022-02-12 01:34:12 +0100 <janus> hololeap: aeson-1.5.6.0-r1 doesn't contain any carriage return
2022-02-12 01:35:20 +0100 <janus> oh but you meant r5
2022-02-12 01:35:49 +0100 <janus> same goes for that one
2022-02-12 01:36:35 +0100 <janus> i just use 'xxd 5.cabal | cut -d" " -f2-' though that feels pretty hacky
2022-02-12 01:38:44 +0100 <monochrom> Do you like tr -d '\r' ?
2022-02-12 01:39:22 +0100 <hololeap> dos2unix works great
2022-02-12 01:39:23 +0100Akiva(~Akiva@user/Akiva) (Ping timeout: 252 seconds)
2022-02-12 01:39:26 +0100shriekingnoise(~shrieking@201.231.16.156) (Quit: Quit)
2022-02-12 01:39:46 +0100DNH(~DNH@2a02:8108:1100:16d8:95db:50d7:7eec:328d) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-02-12 01:40:45 +0100 <janus> monochrom: not sure who's getting asked but i just wanted to get the hex dump without the offsets
2022-02-12 01:41:13 +0100 <monochrom> Oh, nevermind.
2022-02-12 01:41:26 +0100shriekingnoise(~shrieking@201.231.16.156)
2022-02-12 01:41:53 +0100 <janus> fwiw, i just confirmed that chrome does follow the standard , e.g. it sends \r\n even though the html contains only \r. at least with multipart encoding
2022-02-12 01:43:16 +0100 <hololeap> janus: so it has to do with which browser is used to fill out the revision form?
2022-02-12 01:43:17 +0100zebrag(~chris@user/zebrag)
2022-02-12 01:43:39 +0100 <hololeap> I'm just curious at this point :p
2022-02-12 01:44:14 +0100Techcable(~Techcable@168.235.93.147) (Ping timeout: 250 seconds)
2022-02-12 01:44:30 +0100 <janus> nooo, because presumably they all follow the standard. so all browser posted cabal files will have consistent CRLF usage, that's why you see so many. but you can also do revisions with the API as sclv mentions. and if you do it like that, it's just gonna stay as the user's text editor wrote them
2022-02-12 01:45:53 +0100 <janus> if i understand sclv correctly, it all depends on the client since the server isn't caring about it
2022-02-12 01:46:05 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.4)
2022-02-12 01:46:15 +0100alx741(~alx741@157.100.197.240)
2022-02-12 01:46:35 +0100 <hololeap> ok, it all makes sense now
2022-02-12 01:46:44 +0100 <janus> yup
2022-02-12 01:47:09 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-02-12 01:49:28 +0100mvk(~mvk@2607:fea8:5cdc:bf00::f276)
2022-02-12 01:53:07 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 01:53:25 +0100 <Sqaure> Im using optics library (that seems to have nearly the same api as Lens). There are (Affine)Traversal's for Map keys (at <key>) and List indices (ix <index>). I wonder, is there such for List that uses a predicate instead of of an index?
2022-02-12 01:54:41 +0100turlando_(~turlando@93-42-250-112.ip89.fastwebnet.it) (Ping timeout: 256 seconds)
2022-02-12 01:55:18 +0100turlando(~turlando@93-42-250-112.ip89.fastwebnet.it)
2022-02-12 01:55:18 +0100turlando(~turlando@93-42-250-112.ip89.fastwebnet.it) (Changing host)
2022-02-12 01:55:18 +0100turlando(~turlando@user/turlando)
2022-02-12 01:57:28 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.4)
2022-02-12 01:59:13 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-02-12 02:00:59 +0100 <hololeap> like an optics version of find?
2022-02-12 02:01:08 +0100mmhat(~mmh@55d4c207.access.ecotel.net) (Quit: WeeChat 3.4)
2022-02-12 02:01:56 +0100califax(~califax@user/califx) (Remote host closed the connection)
2022-02-12 02:02:24 +0100Ariakenom_(~Ariakenom@h-82-196-111-63.NA.cust.bahnhof.se) (Quit: Leaving)
2022-02-12 02:02:30 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Client Quit)
2022-02-12 02:03:15 +0100califax(~califax@user/califx)
2022-02-12 02:04:12 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-02-12 02:04:28 +0100 <Sqaure> hololeap, yes
2022-02-12 02:04:37 +0100 <hololeap> I wonder if this is it (I'm not very optics-savvy): https://hackage.haskell.org/package/optics-core-0.4/docs/Optics-AffineFold.html#v:filtered
2022-02-12 02:05:41 +0100 <Sqaure> hololeap, yeah i went that rout, but it seems Fold's arent good as setters?
2022-02-12 02:07:36 +0100 <Sqaure> to be able to do : over (<traversal>) mutatateFkn object
2022-02-12 02:08:06 +0100 <dminuoso> Sqaure: Fold are not good as setters because that's precisely their weakness.
2022-02-12 02:08:14 +0100 <dminuoso> A fold can only fold, not retain structure
2022-02-12 02:08:32 +0100 <dminuoso> What you're asking for is not lawful, a kind of Wither
2022-02-12 02:09:28 +0100alx741(~alx741@157.100.197.240)
2022-02-12 02:10:56 +0100 <EvanR> the general fold for a type can do anything xD
2022-02-12 02:10:58 +0100 <Sqaure> Oh, to bad. It felt like a predicate would be pretty similar to an index.
2022-02-12 02:12:12 +0100 <hololeap> \s p -> over s (filter p) :: Setter' s [a] -> (a -> Bool) -> s -> s
2022-02-12 02:12:16 +0100 <hololeap> what about that?
2022-02-12 02:12:40 +0100 <hololeap> just modify the list itself instead of trying to get inside of it
2022-02-12 02:13:28 +0100 <Sqaure> Hmm, that could be something
2022-02-12 02:15:54 +0100emf(~emf@2620:10d:c090:400::5:322c) (Quit: emf)
2022-02-12 02:18:33 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 02:24:41 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Quit: WeeChat 3.4)
2022-02-12 02:30:57 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-02-12 02:31:12 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-02-12 02:31:23 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-02-12 02:37:01 +0100alx741(~alx741@157.100.197.240)
2022-02-12 02:37:12 +0100perrierjouet(~perrier-j@modemcable012.251-130-66.mc.videotron.ca)
2022-02-12 02:40:08 +0100Techcable(~Techcable@168.235.93.147)
2022-02-12 02:40:52 +0100justsomeguy(~justsomeg@user/justsomeguy)
2022-02-12 02:42:28 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 02:43:33 +0100 <jackdk> Sqaure: the version of `filtered` in lens can be used as a traversal but relies on you to not invalidate the predicate when you set back through it
2022-02-12 02:44:45 +0100 <hololeap> :o
2022-02-12 02:44:45 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 02:52:09 +0100 <EvanR> see if this sounds wrong or not: storable vector uses a foreign ptr to bytes so haskell usage of storable vector has to go through the FFI, but is easily accessible by foreign code, same as ByteString. Meanwhile unboxed array and unboxed vector use array primitives and are more easily accessible to haskell code, but obviously inaccessible to foreign code since gc moves them around
2022-02-12 02:52:17 +0100 <hololeap> at :: e -> Lens' (e -> a) (Maybe a)
2022-02-12 02:52:34 +0100 <hololeap> jackdk: I was thinking they might be able to put something together with this ^
2022-02-12 02:53:00 +0100HotblackDesiato(~HotblackD@gateway/tor-sasl/hotblackdesiato) (Ping timeout: 276 seconds)
2022-02-12 02:53:18 +0100 <hololeap> hm, maybe not... I'm not actually sure how that works :p
2022-02-12 02:54:42 +0100HotblackDesiato(~HotblackD@gateway/tor-sasl/hotblackdesiato)
2022-02-12 02:55:17 +0100machinedgod(~machinedg@24.105.81.50) (Ping timeout: 240 seconds)
2022-02-12 02:56:37 +0100sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Ping timeout: 240 seconds)
2022-02-12 02:58:46 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf) (Ping timeout: 250 seconds)
2022-02-12 02:59:51 +0100senoraraton(~senorarat@192-195-83-130.static.monkeybrains.net)
2022-02-12 03:00:20 +0100 <hololeap> ix :: e -> Lens' (e -> Maybe a) (Maybe a)
2022-02-12 03:00:22 +0100hololeapshrugs
2022-02-12 03:00:35 +0100ezzieyguywuf(~Unknown@user/ezzieyguywuf)
2022-02-12 03:01:07 +0100alx741(~alx741@157.100.197.240)
2022-02-12 03:03:46 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 03:04:38 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 03:06:34 +0100kayvank(~user@52-119-115-185.PUBLIC.monkeybrains.net) (Ping timeout: 250 seconds)
2022-02-12 03:06:50 +0100xsperry(~xs@user/xsperry) (Remote host closed the connection)
2022-02-12 03:06:54 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 03:08:55 +0100neurocyte0917090(~neurocyte@user/neurocyte) (Ping timeout: 256 seconds)
2022-02-12 03:10:48 +0100califax-(~califax@user/califx)
2022-02-12 03:10:54 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 250 seconds)
2022-02-12 03:12:39 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
2022-02-12 03:13:19 +0100xkuru(~xkuru@user/xkuru) (Read error: Connection reset by peer)
2022-02-12 03:14:15 +0100harveypwca(~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67)
2022-02-12 03:14:27 +0100califax(~califax@user/califx) (Ping timeout: 276 seconds)
2022-02-12 03:14:27 +0100califax-califax
2022-02-12 03:14:28 +0100burnsidesLlama(~burnsides@dhcp168-030.wadham.ox.ac.uk) (Remote host closed the connection)
2022-02-12 03:20:14 +0100alx741(~alx741@157.100.197.240)
2022-02-12 03:21:52 +0100 <hololeap> at that point it might just make sense to turn your [a] into a (Map Bool [a]) and then use `at` on it
2022-02-12 03:22:36 +0100gentauro(~gentauro@user/gentauro) (Read error: Connection reset by peer)
2022-02-12 03:24:59 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 03:25:45 +0100 <EvanR> Map Bool [a] = Bool -> [a] = ([a], [a]) xD
2022-02-12 03:26:20 +0100 <EvanR> (ok, technically no)
2022-02-12 03:27:33 +0100gentauro(~gentauro@user/gentauro)
2022-02-12 03:28:06 +0100 <hololeap> :t partition -- right, forgot about that
2022-02-12 03:28:07 +0100 <lambdabot> (a -> Bool) -> [a] -> ([a], [a])
2022-02-12 03:29:29 +0100 <EvanR> the map could be missing one or both
2022-02-12 03:30:56 +0100 <hololeap> :t \k -> maybe [] id . Map.lookup k
2022-02-12 03:30:57 +0100 <lambdabot> error:
2022-02-12 03:30:57 +0100 <lambdabot> Not in scope: ‘Map.lookup’
2022-02-12 03:30:57 +0100 <lambdabot> Perhaps you meant one of these:
2022-02-12 03:33:39 +0100jao(~jao@static-68-235-44-40.cust.tzulo.com)
2022-02-12 03:33:50 +0100 <EvanR> :t Data.Map.lookup
2022-02-12 03:33:51 +0100 <lambdabot> Ord k => k -> M.Map k a -> Maybe a
2022-02-12 03:34:04 +0100 <EvanR> oh, M dot
2022-02-12 03:40:54 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-02-12 03:41:23 +0100alx741(~alx741@157.100.197.240)
2022-02-12 03:44:39 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 03:48:57 +0100vysn(~vysn@user/vysn) (Ping timeout: 240 seconds)
2022-02-12 03:57:26 +0100xff0x(~xff0x@2001:1a81:5217:8700:5c4c:6e43:a062:eba7) (Ping timeout: 252 seconds)
2022-02-12 03:58:17 +0100xff0x(~xff0x@2001:1a81:524f:ad00:7c68:ef8b:b4b7:1f26)
2022-02-12 03:58:51 +0100k8yun(~k8yun@user/k8yun)
2022-02-12 03:59:52 +0100modnar(~modnar@shell.sonic.net) (Remote host closed the connection)
2022-02-12 04:02:47 +0100alx741(~alx741@157.100.197.240)
2022-02-12 04:03:47 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-02-12 04:05:13 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 04:11:24 +0100yauhsien_(~yauhsien@61-231-32-103.dynamic-ip.hinet.net)
2022-02-12 04:11:35 +0100slim(uid300876@id-300876.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2022-02-12 04:15:47 +0100yauhsien_(~yauhsien@61-231-32-103.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
2022-02-12 04:21:54 +0100alx741(~alx741@157.100.197.240)
2022-02-12 04:23:38 +0100xff0x(~xff0x@2001:1a81:524f:ad00:7c68:ef8b:b4b7:1f26) (Ping timeout: 260 seconds)
2022-02-12 04:23:43 +0100jao(~jao@static-68-235-44-40.cust.tzulo.com) (Ping timeout: 256 seconds)
2022-02-12 04:24:30 +0100xff0x(~xff0x@2001:1a81:524f:ad00:4eb7:4d9:8878:178f)
2022-02-12 04:25:28 +0100jao(~jao@static-68-235-44-72.cust.tzulo.com)
2022-02-12 04:26:35 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 04:33:57 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-02-12 04:34:05 +0100td_(~td@94.134.91.17) (Ping timeout: 250 seconds)
2022-02-12 04:34:37 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-02-12 04:35:02 +0100kilolympus(~kilolympu@31.205.200.235) (Read error: Connection reset by peer)
2022-02-12 04:35:08 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 04:35:44 +0100td_(~td@94.134.91.27)
2022-02-12 04:35:49 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Client Quit)
2022-02-12 04:38:11 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2022-02-12 04:38:11 +0100finn_elija(~finn_elij@user/finn-elija/x-0085643)
2022-02-12 04:38:11 +0100finn_elijaFinnElija
2022-02-12 04:40:43 +0100waleee(~waleee@h-98-128-229-110.NA.cust.bahnhof.se) (Ping timeout: 256 seconds)
2022-02-12 04:42:25 +0100mstksg(~jle`@cpe-23-240-75-236.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 04:44:04 +0100mstksg(~jle`@cpe-23-240-75-236.socal.res.rr.com)
2022-02-12 04:44:39 +0100alx741(~alx741@157.100.197.240)
2022-02-12 04:44:49 +0100terrorjack(~terrorjac@2a01:4f8:1c1e:509a::1) (Quit: The Lounge - https://thelounge.chat)
2022-02-12 04:46:03 +0100terrorjack(~terrorjac@2a01:4f8:1c1e:509a::1)
2022-02-12 04:49:22 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.4)
2022-02-12 04:53:57 +0100justsomeguy(~justsomeg@user/justsomeguy) (Quit: WeeChat 3.4)
2022-02-12 04:54:38 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 04:57:06 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 04:57:18 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 04:58:36 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Client Quit)
2022-02-12 04:58:50 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 05:01:22 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-02-12 05:01:41 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 256 seconds)
2022-02-12 05:01:50 +0100 <ProfSimm> In Haskell when I perform side-effects, is there some abstraction to guarantee a "Transaction" on the effects, make them atomic. And if so, how would that work with things like sending something over a TCP socket.
2022-02-12 05:01:52 +0100 <ProfSimm> Can't unsend.
2022-02-12 05:02:21 +0100 <c_wraith> you're correct. there's no such thing as making arbitrary effects atomic
2022-02-12 05:03:28 +0100 <Maxdamantus> So `State RealWorld#` is a lie!?
2022-02-12 05:04:10 +0100 <ProfSimm> c_wraith: well not like I was hoping for magic (well, a little), my question is more about is there a way to reason about those in a sane way without atomicity
2022-02-12 05:06:25 +0100 <ski> how do you make exception effects atomic or transactional ? nondeterminism effects ?
2022-02-12 05:07:22 +0100sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
2022-02-12 05:07:42 +0100 <ProfSimm> ski: "finally"?
2022-02-12 05:07:58 +0100 <ProfSimm> ski: undo sagas, as a more general concept
2022-02-12 05:08:02 +0100 <Maxdamantus> In general, it's not possible to include something externnal to your transaction within your transaction.
2022-02-12 05:08:37 +0100 <ski> "finally" doesn't undo an exception being thrown
2022-02-12 05:08:51 +0100 <Maxdamantus> Theoretically you could creatu a framuwork where the TCP sending is part of a transaction, but receiving a response from an entity that exists outside can't be part of it.
2022-02-12 05:11:06 +0100 <ProfSimm> ski: my problem isn't the existence of the exception typically, but rather the partial operations and unfreed resources it leaves behind, hence finally. Or did you mean in some other way. Transaction means it can fail, it just failed atomically. Transaction doesn't mean it has to succeed
2022-02-12 05:11:44 +0100alx741(~alx741@157.100.197.240)
2022-02-12 05:11:57 +0100 <ski> > do z <- [1 ..]; y <- [1 .. z]; x <- [1 .. y]; guard (x^2 + y^2 == z^2); return (x,y,z) -- how do you perform nondeterminism effects like these transactionally, atomically ? what does that even mean, to begin with ?
2022-02-12 05:12:00 +0100 <lambdabot> [(3,4,5),(6,8,10),(5,12,13),(9,12,15),(8,15,17),(12,16,20),(15,20,25),(7,24,...
2022-02-12 05:12:44 +0100 <ski> if you're interacting with the outside world, it does seem hard to make that atomic or transactional, at least without cooperation from the other side
2022-02-12 05:12:47 +0100 <ProfSimm> ski: well I'm just pondering how to deal with non-happy path in a way that doesn't explode into a fractal of special cases.
2022-02-12 05:13:54 +0100 <ski> "my problem isn't the existence of the exception typically" -- well, transactions are about isolating effects, so that either all are performed, or none, do you agree ?
2022-02-12 05:13:55 +0100 <ProfSimm> ski: yes, well hence the "undo saga" note. Sometimes you can code compensatory action that's not literally undo, but you can consider the action semantically undone for your purpose. Such as bill a credit card, then refund it. There's still a fee, but the action is sufficiently "undone"
2022-02-12 05:14:40 +0100 <ski> to "fail" exceptions raising, you'd need some way to undo raising the exceptions
2022-02-12 05:15:17 +0100 <ProfSimm> I don't see exceptions as a side-effect, despite they may not fit into a math model of purity
2022-02-12 05:15:24 +0100 <ski> (raising an exception here is not considered "failure". rather raising exceptions would be the effects that a failure of the transaction would have to undo)
2022-02-12 05:15:27 +0100 <ProfSimm> I see them as syntax sugar on a branch
2022-02-12 05:15:42 +0100 <ski> yea, i've not been talking about any side-effects here
2022-02-12 05:15:57 +0100 <ProfSimm> Well I don't know why we want to undo an exception being risen.
2022-02-12 05:15:58 +0100 <ski> (i've been talking about effects)
2022-02-12 05:16:11 +0100 <ProfSimm> OK I don't see exceptions as an "effect" then
2022-02-12 05:16:16 +0100 <ski> well, you started talking about having transactions of effects
2022-02-12 05:16:41 +0100 <ProfSimm> ski: well I'll be damned.
2022-02-12 05:16:49 +0100 <ProfSimm> ski: I mean side-effects
2022-02-12 05:16:49 +0100 <ski> there are many kinds of effects. I/O, state, exception, (angelic) nondeterminism, environment, summarizing/logging/output, continuation, &c.
2022-02-12 05:17:01 +0100 <ProfSimm> Well I mean external effects basically
2022-02-12 05:17:05 +0100 <ski> there are no side-effects in Haskell, so you must be talking about some other language, then
2022-02-12 05:17:11 +0100 <ProfSimm> Man.
2022-02-12 05:17:14 +0100 <ProfSimm> You know what I mean
2022-02-12 05:17:44 +0100 <ski> ok, external, i guess that means I/O, then
2022-02-12 05:17:54 +0100 <ProfSimm> In a nutshell, files, sockets, pipes. Yes. I/O
2022-02-12 05:18:01 +0100 <ProfSimm> Interaction with the "world"
2022-02-12 05:18:02 +0100 <ski> (sorry, i do not know what you mean)
2022-02-12 05:18:04 +0100 <ski> yes
2022-02-12 05:18:10 +0100Midjak(~Midjak@may53-1-78-226-116-92.fbx.proxad.net) (Quit: This computer has gone to sleep)
2022-02-12 05:19:29 +0100 <ski> (i don't know why people often keep saying "you know what i mean". my experience has been that almost always, when people say that, i do not know what they mean. maybe it's a kind of appeal, "you know what i mean, right ?", only not expressed as a question)
2022-02-12 05:19:56 +0100 <hololeap> they assume you're being pedantic on purpose
2022-02-12 05:20:37 +0100 <ski> well, if i am (i'm not sure), then i do not know how not to be that
2022-02-12 05:21:16 +0100 <ProfSimm> hololeap: I don't assume that. But I beg for compassion ;-)
2022-02-12 05:21:23 +0100 <ProfSimm> When using terms incorrectly
2022-02-12 05:21:38 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 05:21:38 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 05:21:38 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 05:22:22 +0100 <ProfSimm> ski: but you did know what I mean (interaction with other systems outside the language internal state) ;-)
2022-02-12 05:22:59 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 05:23:50 +0100 <ski> well, i offered that as one possible thing which you might be aiming at. i didn't know that that was what you were asking about
2022-02-12 05:24:09 +0100 <ProfSimm> ski: cool :)
2022-02-12 05:24:29 +0100 <ski> (you started asking about side-effects. since there are no side-effects in Haskell, i got thinking about effects. next question was *which* effects you wanted to talk about. the most common ones ? only some particular specific ones ?)
2022-02-12 05:24:36 +0100 <ProfSimm> ski: so is there a strategy here, or we deal with things on a one-by-one basis (effects)
2022-02-12 05:25:02 +0100 <ski> i'm not aware of any general framework for isolating effects transactionally
2022-02-12 05:25:26 +0100 <ski> if we're talking about internal state, then there's `STM' (Software-Transactional Memory), for that
2022-02-12 05:26:03 +0100 <ski> (which composes well with multiple executing threads)
2022-02-12 05:26:48 +0100 <ski> if you're doing I/O, say communicating between some servers on different machines, doing some kind of distributed computation, then you might be able to do transaction management, if you control all those nodes
2022-02-12 05:26:57 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-02-12 05:27:38 +0100 <ski> (i think there might be sortof-general patterns for that sort of thing, in the Erlang community)
2022-02-12 05:28:57 +0100 <ski> (btw, the reason i said i'm not sure before is that i think i mostly don't understand myself. this includes not knowing all my motivations)
2022-02-12 05:29:20 +0100 <hololeap> I assume something like postgres knows how to do this
2022-02-12 05:29:31 +0100 <ProfSimm> Sure, SQL servers are the easy part
2022-02-12 05:30:15 +0100 <hololeap> as far as making it a monad of some sort, unfortunately abstractions like "monad" either fit or they don't, and generally they don't
2022-02-12 05:30:35 +0100 <ProfSimm> ski: I was thinking more about how to organize my code in Haskell around that idiom of there being code that does something, and code that undoes it, and let the right "bits of code" run depending on which code failed or not etc.
2022-02-12 05:32:02 +0100 <ProfSimm> ski: let's say I'm programming an online store. I bill a card, then i check product for availability - error, no availability (I know, shoulda checked beforehand), so I raise an exception, this automatically enums all actions I did so far, and runs their 'undo code' automatically, which refunds the payment in this case
2022-02-12 05:33:02 +0100rekahsoft(~rekahsoft@cpe0008a20f982f-cm64777d666260.cpe.net.cable.rogers.com) (Ping timeout: 240 seconds)
2022-02-12 05:33:08 +0100 <ski> yea, monads "merely" express "(dynamic) sequencing" ("sequencing" in a more abstract, conceptual way, not necessarily in a low-level operational sense. one possible meaning of "sequencing" is "short-circuiting". another is "loop nesting". another is "callback nesting". &c.)
2022-02-12 05:35:12 +0100jao(~jao@static-68-235-44-72.cust.tzulo.com) (Ping timeout: 250 seconds)
2022-02-12 05:35:57 +0100Unicorn_Princess(~Unicorn_P@93-103-228-248.dynamic.t-2.net) (Quit: Leaving)
2022-02-12 05:36:50 +0100 <hololeap> ProfSimm: you could build this yourself pretty easily I would think
2022-02-12 05:37:38 +0100deadmarshal(~deadmarsh@95.38.112.73)
2022-02-12 05:38:25 +0100 <hololeap> :t \l1 l2 -> zip l1 (drop 1 l2)
2022-02-12 05:38:26 +0100 <lambdabot> [a] -> [b] -> [(a, b)]
2022-02-12 05:39:08 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 05:39:52 +0100ProfSimmnods at hololeap
2022-02-12 05:39:57 +0100alx741(~alx741@157.100.197.240)
2022-02-12 05:40:03 +0100 <ski> hm, i remember i once did a play/replay system (to be used with a CGI page with forms). from the point of the program using the library, doing a form, getting the answer back, just looked like executing an action. but under the covers, it'd record enough of the state of the system, and then generate a page with a form on it, so that, if/when the form was submitted, the program would restart, and hit the
2022-02-12 05:40:09 +0100 <ski> "replay" phase, fast-forwarding past all the previously done parts (only simulating performing `IO' actions, by reading a logged result), until it got to the point where it stopped last time, and then it hit the "play" phase, starting to execute normally
2022-02-12 05:40:32 +0100 <hololeap> :t \l -> zip l (drop 1 l) -- if l is a stream of events from IO, this will give you a stream (modeled as a list) of (lastEvent, currentEvent)
2022-02-12 05:40:33 +0100 <lambdabot> [b] -> [(b, b)]
2022-02-12 05:42:00 +0100 <ski> this is not quite the sort of thing you were thinking of. but i think one could possibly try to do something similar, with "undo" actions stored, rather than "replay"
2022-02-12 05:45:30 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 06:00:55 +0100motherfsck(~motherfsc@user/motherfsck) (Quit: quit)
2022-02-12 06:03:37 +0100alx741(~alx741@157.100.197.240)
2022-02-12 06:07:11 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 06:11:10 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 250 seconds)
2022-02-12 06:23:38 +0100alx741(~alx741@157.100.197.240)
2022-02-12 06:27:49 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 06:35:51 +0100 <Andrew> If you are using GHC 6.10.x, just cabal install lambdabot. 6.12.x support is forthcoming; see /Building for details on that. (It is possible that Hackage lambdabot will just work with 6.12.x.) / I think I'm on 8.10.4 now, seems a bit outdated
2022-02-12 06:38:16 +0100phma_(phma@2001:5b0:210d:70f8:60e0:e2f9:8ba1:2fd7) (Read error: Connection reset by peer)
2022-02-12 06:38:27 +0100 <Andrew> Seems that cabal isn't complaining installing lambdabot yet
2022-02-12 06:38:40 +0100phma_(~phma@host-67-44-208-185.hnremote.net)
2022-02-12 06:39:04 +0100gawen_(~gawen@user/gawen) (Quit: cya)
2022-02-12 06:40:03 +0100phma_phma
2022-02-12 06:40:22 +0100gawen(~gawen@user/gawen)
2022-02-12 06:44:41 +0100ldlework(~hexeme@user/hexeme) (Remote host closed the connection)
2022-02-12 06:44:48 +0100alx741(~alx741@157.100.197.240)
2022-02-12 06:46:01 +0100hexeme(~hexeme@user/hexeme)
2022-02-12 06:49:51 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 06:50:36 +0100zebrag(~chris@user/zebrag) (Quit: Konversation terminated!)
2022-02-12 06:53:56 +0100takuan(~takuan@178-116-218-225.access.telenet.be)
2022-02-12 06:54:47 +0100mvk(~mvk@2607:fea8:5cdc:bf00::f276) (Ping timeout: 256 seconds)
2022-02-12 07:02:44 +0100raym(~raym@user/raym) (Quit: kernel update, rebooting...)
2022-02-12 07:03:22 +0100foul_owl(~kerry@174-21-76-71.tukw.qwest.net) (Quit: WeeChat 2.3)
2022-02-12 07:06:53 +0100alx741(~alx741@157.100.197.240)
2022-02-12 07:10:21 +0100foul_owl(~kerry@174-21-76-71.tukw.qwest.net)
2022-02-12 07:12:11 +0100slowButPresent(~slowButPr@user/slowbutpresent) (Quit: leaving)
2022-02-12 07:15:18 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 07:19:49 +0100raym(~raym@user/raym)
2022-02-12 07:22:25 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 07:22:25 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 07:22:25 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 07:25:30 +0100k8yun(~k8yun@user/k8yun) (Quit: Leaving)
2022-02-12 07:27:34 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-02-12 07:33:31 +0100alx741(~alx741@157.100.197.240)
2022-02-12 07:39:17 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 07:39:28 +0100shapr(~user@pool-173-73-44-186.washdc.fios.verizon.net) (Ping timeout: 256 seconds)
2022-02-12 07:53:49 +0100zaquest(~notzaques@5.130.79.72) (Remote host closed the connection)
2022-02-12 07:54:57 +0100zaquest(~notzaques@5.130.79.72)
2022-02-12 07:55:51 +0100little_mac(~little_ma@2601:410:4300:3ce0:9142:26a8:3892:1b3a) (Remote host closed the connection)
2022-02-12 07:56:57 +0100alx741(~alx741@157.100.197.240)
2022-02-12 08:00:40 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 08:06:25 +0100hexemeldlework
2022-02-12 08:08:15 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 08:09:55 +0100fef(~thedawn@user/thedawn)
2022-02-12 08:10:33 +0100jonathanx_(~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
2022-02-12 08:11:37 +0100jonathanx(~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 250 seconds)
2022-02-12 08:18:34 +0100alx741(~alx741@157.100.197.240)
2022-02-12 08:23:12 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 08:32:10 +0100deadmarshal(~deadmarsh@95.38.112.73) (Ping timeout: 256 seconds)
2022-02-12 08:40:42 +0100eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-02-12 08:40:49 +0100deadmarshal(~deadmarsh@95.38.230.187)
2022-02-12 08:41:05 +0100alx741(~alx741@157.100.197.240)
2022-02-12 08:41:57 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 240 seconds)
2022-02-12 08:42:57 +0100phma(~phma@host-67-44-208-185.hnremote.net) (Read error: Connection reset by peer)
2022-02-12 08:43:50 +0100alp(~alp@user/alp)
2022-02-12 08:44:04 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 08:44:11 +0100phma(~phma@host-67-44-208-247.hnremote.net)
2022-02-12 08:45:20 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 08:55:18 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 08:59:04 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 09:00:15 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 09:01:21 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 09:02:02 +0100alx741(~alx741@157.100.197.240)
2022-02-12 09:03:54 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 256 seconds)
2022-02-12 09:05:45 +0100Graham31415(~Graham314@213.237.92.153)
2022-02-12 09:06:38 +0100whound(~dust@2409:4071:4d8d:7b21:2586:8c37:2856:667a)
2022-02-12 09:08:11 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 09:16:06 +0100zincy(~tom@host86-160-236-152.range86-160.btcentralplus.com) (Remote host closed the connection)
2022-02-12 09:16:23 +0100zincy(~tom@2a00:23c8:970c:4801:5b6a:e81b:79dc:f684)
2022-02-12 09:20:38 +0100yauhsien_(~yauhsien@61-231-32-103.dynamic-ip.hinet.net)
2022-02-12 09:21:13 +0100vglfr(~vglfr@coupling.penchant.volia.net) (Ping timeout: 256 seconds)
2022-02-12 09:21:20 +0100max22-(~maxime@lfbn-ren-1-1026-62.w92-139.abo.wanadoo.fr)
2022-02-12 09:21:59 +0100vglfr(~vglfr@coupling.penchant.volia.net)
2022-02-12 09:22:47 +0100gehmehgeh(~user@user/gehmehgeh)
2022-02-12 09:25:45 +0100yauhsien_(~yauhsien@61-231-32-103.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
2022-02-12 09:26:36 +0100alx741(~alx741@157.100.197.240)
2022-02-12 09:27:53 +0100_ht(~quassel@231-169-21-31.ftth.glasoperator.nl)
2022-02-12 09:30:16 +0100zeenk(~zeenk@2a02:2f04:a30d:1300:51a3:bcfc:6cda:9fc5)
2022-02-12 09:30:39 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 09:30:39 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 09:32:48 +0100senoraraton(~senorarat@192-195-83-130.static.monkeybrains.net) (Remote host closed the connection)
2022-02-12 09:34:20 +0100sqrt2(~ben@80-108-18-7.cable.dynamic.surfer.at) (Quit: ZNC - http://znc.in)
2022-02-12 09:36:57 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net)
2022-02-12 09:39:28 +0100vysn(~vysn@user/vysn)
2022-02-12 09:41:12 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7)
2022-02-12 09:45:17 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7) (Ping timeout: 240 seconds)
2022-02-12 09:48:45 +0100alp(~alp@user/alp) (Ping timeout: 256 seconds)
2022-02-12 09:49:08 +0100alx741(~alx741@157.100.197.240)
2022-02-12 09:49:40 +0100little_mac(~little_ma@2601:410:4300:3ce0:b88b:16c0:25d0:773a)
2022-02-12 09:52:23 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer)
2022-02-12 10:00:42 +0100cosimone(~user@93-44-184-23.ip98.fastwebnet.it)
2022-02-12 10:00:42 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 10:04:51 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 10:13:46 +0100Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2022-02-12 10:15:22 +0100ardell(~ardell@user/ardell)
2022-02-12 10:17:30 +0100Tuplanolla(~Tuplanoll@91-159-69-98.elisa-laajakaista.fi)
2022-02-12 10:18:43 +0100alx741(~alx741@157.100.197.240)
2022-02-12 10:18:59 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 10:23:01 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 10:23:25 +0100tfeb(~tfb@88.98.95.237)
2022-02-12 10:24:21 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2022-02-12 10:25:54 +0100econo(uid147250@user/econo) (Quit: Connection closed for inactivity)
2022-02-12 10:28:32 +0100tfeb(~tfb@88.98.95.237) (Quit: died)
2022-02-12 10:32:40 +0100mc47(~mc47@xmonad/TheMC47)
2022-02-12 10:32:45 +0100zeenk(~zeenk@2a02:2f04:a30d:1300:51a3:bcfc:6cda:9fc5) (Quit: Konversation terminated!)
2022-02-12 10:33:57 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 240 seconds)
2022-02-12 10:35:01 +0100ProfSimm(~ProfSimm@87.227.196.109) (Remote host closed the connection)
2022-02-12 10:38:50 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Remote host closed the connection)
2022-02-12 10:39:01 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 10:39:01 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 10:39:01 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 10:39:16 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2022-02-12 10:41:29 +0100little_mac(~little_ma@2601:410:4300:3ce0:b88b:16c0:25d0:773a) (Quit: Leaving)
2022-02-12 10:41:36 +0100alx741(~alx741@157.100.197.240)
2022-02-12 10:42:04 +0100alp(~alp@user/alp)
2022-02-12 10:43:58 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 260 seconds)
2022-02-12 10:44:48 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 10:47:53 +0100xsperry(~xs@user/xsperry)
2022-02-12 10:49:23 +0100whounddust__
2022-02-12 10:49:26 +0100dust__dust_
2022-02-12 11:01:57 +0100alx741(~alx741@157.100.197.240)
2022-02-12 11:05:09 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 11:07:46 +0100Graham31415(~Graham314@213.237.92.153) (Quit: Client closed)
2022-02-12 11:14:48 +0100fef(~thedawn@user/thedawn) (Ping timeout: 276 seconds)
2022-02-12 11:15:20 +0100tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
2022-02-12 11:21:40 +0100chenqisu1(~chenqisu1@183.217.200.249) (Quit: Leaving)
2022-02-12 11:23:34 +0100alx741(~alx741@157.100.197.240)
2022-02-12 11:23:38 +0100notzmv(~zmv@user/notzmv) (Ping timeout: 260 seconds)
2022-02-12 11:24:26 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 11:27:27 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 11:28:03 +0100alx741(~alx741@157.100.197.240)
2022-02-12 11:34:43 +0100mastarija(~mastarija@2a05:4f46:e04:6000:2c:c10d:58d8:d23b)
2022-02-12 11:37:45 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 11:40:23 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 11:46:43 +0100lottaquestions_(~nick@2607:fa49:5041:a200:78c8:bb9f:f5b1:85aa) (Quit: Konversation terminated!)
2022-02-12 11:49:00 +0100noiobeforebed(~noiobefor@2001:470:69fc:105::1:3c2d) (Quit: Reconnecting)
2022-02-12 11:49:27 +0100dust_(~dust@2409:4071:4d8d:7b21:2586:8c37:2856:667a) (Quit: Konversation terminated!)
2022-02-12 11:49:56 +0100cynomys(~cynomys@user/cynomys) (Ping timeout: 256 seconds)
2022-02-12 11:51:20 +0100alp(~alp@user/alp) (Ping timeout: 250 seconds)
2022-02-12 11:57:29 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2022-02-12 11:57:56 +0100coot(~coot@213.134.190.95)
2022-02-12 11:58:36 +0100alx741(~alx741@157.100.197.240)
2022-02-12 12:02:43 +0100Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 256 seconds)
2022-02-12 12:02:43 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 12:02:54 +0100zeenk(~zeenk@2a02:2f04:a30d:1300:51a3:bcfc:6cda:9fc5)
2022-02-12 12:04:04 +0100Lord_of_Life(~Lord@user/lord-of-life/x-2819915)
2022-02-12 12:04:13 +0100Cale(~cale@cpef48e38ee8583-cm30b7d4b3fc20.cpe.net.cable.rogers.com) (Ping timeout: 240 seconds)
2022-02-12 12:07:02 +0100coot(~coot@213.134.190.95) (Quit: coot)
2022-02-12 12:09:30 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7)
2022-02-12 12:09:38 +0100cosimone(~user@93-44-184-23.ip98.fastwebnet.it) (Remote host closed the connection)
2022-02-12 12:09:53 +0100Graham31415(~Graham314@213.237.92.153)
2022-02-12 12:10:29 +0100cosimone(~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20)
2022-02-12 12:10:46 +0100shailangsa(~shailangs@host217-39-45-199.range217-39.btcentralplus.com) ()
2022-02-12 12:13:41 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7) (Ping timeout: 245 seconds)
2022-02-12 12:16:18 +0100mastarija(~mastarija@2a05:4f46:e04:6000:2c:c10d:58d8:d23b) (Quit: Leaving)
2022-02-12 12:17:23 +0100Cale(~cale@cpef48e38ee8583-cm30b7d4b3fc20.cpe.net.cable.rogers.com)
2022-02-12 12:18:26 +0100 <Andrew> Anyone has an idea on installing and using lambdabot properly? I cabel'ed it, and I'm confused what to do
2022-02-12 12:18:36 +0100 <Andrew> It seems to take me to a REPL where I don't have an idea what to put into
2022-02-12 12:18:50 +0100 <absentia> @help
2022-02-12 12:18:50 +0100 <lambdabot> help <command>. Ask for help for <command>. Try 'list' for all commands
2022-02-12 12:18:55 +0100 <absentia> @pl (\x -> x)
2022-02-12 12:18:55 +0100 <lambdabot> id
2022-02-12 12:19:49 +0100 <Andrew> Well, I mean I'm trying to host lambdabot, and my inability to understand how to run it after cabeling is the problem
2022-02-12 12:21:08 +0100alx741(~alx741@157.100.197.240)
2022-02-12 12:21:10 +0100 <absentia> blech
2022-02-12 12:21:19 +0100 <absentia> no stack for lambdabot?
2022-02-12 12:21:21 +0100 <absentia> :(
2022-02-12 12:22:03 +0100 <absentia> isn't there a cabal run
2022-02-12 12:22:11 +0100 <absentia> good luck sorting out your dependencies
2022-02-12 12:22:13 +0100 <sshine> I've heard cabal is really easy. :P
2022-02-12 12:22:23 +0100 <absentia> sshine: it's easy until it isn't
2022-02-12 12:22:33 +0100 <absentia> Andrew: what happens if you `cabal run`
2022-02-12 12:23:09 +0100 <sshine> apparently there are no installation instructions for lambdabot. that seems like a useful addition.
2022-02-12 12:23:20 +0100 <absentia> https://wiki.haskell.org/Lambdabot#Installing
2022-02-12 12:23:32 +0100 <Andrew> #installing, but no #running or anything like that
2022-02-12 12:23:33 +0100 <sshine> ah, okay. I was looking at github.
2022-02-12 12:23:35 +0100 <absentia> there are marginal instructions
2022-02-12 12:23:37 +0100 <Andrew> I don't see configuration options
2022-02-12 12:23:46 +0100 <Andrew> Error:
2022-02-12 12:23:48 +0100 <Andrew> [ERROR] Plugin.djinn: Djinn command failed: djinn: readCreateProcess: runInteractiveProcess: exec: does not exist (No such file or directory)
2022-02-12 12:23:59 +0100Andrewlooks for a ebuild of "djinn"
2022-02-12 12:24:11 +0100 <absentia> choo choo
2022-02-12 12:24:17 +0100 <absentia> all stations stop to next build error
2022-02-12 12:24:19 +0100 <Andrew> Doesn't pull that as a dep, weird
2022-02-12 12:24:35 +0100 <Andrew> k, emerging that now
2022-02-12 12:24:44 +0100absentiagives the nod of approval
2022-02-12 12:24:49 +0100 <absentia> i too used to funroll my loops
2022-02-12 12:25:16 +0100 <sshine> absentia, those installation instructions make assumptions about GHC that are two major versions behind what I've got...
2022-02-12 12:25:17 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 12:25:17 +0100OscarZ(~oscarz@95.175.104.142) (Quit: Leaving)
2022-02-12 12:25:27 +0100 <Andrew> still having djinn problems, fun
2022-02-12 12:25:28 +0100 <absentia> sshine: hence my questioning of a stack build
2022-02-12 12:25:42 +0100 <Andrew> wait, wth I didn't add ~/.cabal/bin to my PATH
2022-02-12 12:25:45 +0100 <sshine> cabal: Unknown target '.'. There is no component '.'. The project has no package directory '.'.
2022-02-12 12:25:45 +0100 <absentia> they still offer lts package trees for older versions of GHC
2022-02-12 12:25:52 +0100 <sshine> I don't think this software was meant to be run by many people.
2022-02-12 12:25:56 +0100 <absentia> probably not
2022-02-12 12:26:02 +0100 <absentia> which is fine
2022-02-12 12:26:05 +0100 <absentia> it works here
2022-02-12 12:27:23 +0100 <sshine> Andrew, there's an attempt at documentation of running it here: https://github.com/lambdabot/lambdabot/blob/master/doc/startup.md -- but it doesn't really start from the point of successfully having installed it.
2022-02-12 12:27:48 +0100 <Andrew> thanks, ill check it our
2022-02-12 12:27:50 +0100 <Andrew> *out
2022-02-12 12:29:50 +0100 <sshine> I think I gave up on installing lambdabot one time.
2022-02-12 12:30:37 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 12:30:40 +0100haskl(~haskl@user/haskl) (Read error: Connection reset by peer)
2022-02-12 12:32:48 +0100 <Andrew> Maybe I'll Just do Nothing with it
2022-02-12 12:33:03 +0100haskl(~haskl@user/haskl)
2022-02-12 12:37:51 +0100acidsys(~LSD@2a03:4000:55:d20::3) (Excess Flood)
2022-02-12 12:39:25 +0100acidsys(~LSD@2a03:4000:55:d20::3)
2022-02-12 12:41:01 +0100tcard(~tcard@p2878075-ipngn18701hodogaya.kanagawa.ocn.ne.jp) (Remote host closed the connection)
2022-02-12 12:41:17 +0100tcard(~tcard@p2878075-ipngn18701hodogaya.kanagawa.ocn.ne.jp)
2022-02-12 12:42:18 +0100alx741(~alx741@157.100.197.240)
2022-02-12 12:42:23 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 12:43:45 +0100Ariakenom(~Ariakenom@2001:9b1:efe:9d00:91:c891:6ad5:7a10)
2022-02-12 12:45:03 +0100michalz(~michalz@185.246.204.65)
2022-02-12 12:45:52 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 12:46:12 +0100Midjak(~Midjak@may53-1-78-226-116-92.fbx.proxad.net)
2022-02-12 12:47:12 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-02-12 12:48:10 +0100Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-02-12 12:53:39 +0100Ariakenom_(~Ariakenom@h-82-196-111-63.NA.cust.bahnhof.se)
2022-02-12 12:53:48 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 12:55:39 +0100fef(~thedawn@user/thedawn)
2022-02-12 12:57:26 +0100Ariakenom(~Ariakenom@2001:9b1:efe:9d00:91:c891:6ad5:7a10) (Ping timeout: 245 seconds)
2022-02-12 12:58:15 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 13:00:51 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 13:03:55 +0100alx741(~alx741@157.100.197.240)
2022-02-12 13:04:34 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 250 seconds)
2022-02-12 13:05:37 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 256 seconds)
2022-02-12 13:07:30 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 13:09:58 +0100Axman6(~Axman6@user/axman6) (*.net *.split)
2022-02-12 13:09:58 +0100tubogram4(~tubogram@user/tubogram) (*.net *.split)
2022-02-12 13:10:04 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 13:11:48 +0100DNH(~DNH@2a02:8108:1100:16d8:95db:50d7:7eec:328d)
2022-02-12 13:13:55 +0100mmhat(~mmh@55d4ce4d.access.ecotel.net)
2022-02-12 13:14:22 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 13:23:31 +0100max22-(~maxime@lfbn-ren-1-1026-62.w92-139.abo.wanadoo.fr) (Ping timeout: 256 seconds)
2022-02-12 13:23:56 +0100alx741(~alx741@181.199.42.143)
2022-02-12 13:28:39 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 13:35:16 +0100alx741(~alx741@181.199.42.143) (Read error: Connection reset by peer)
2022-02-12 13:35:55 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-02-12 13:36:30 +0100ardell(~ardell@user/ardell) (Quit: Konversation terminated!)
2022-02-12 13:38:17 +0100machinedgod(~machinedg@24.105.81.50)
2022-02-12 13:40:48 +0100notzmv(~zmv@user/notzmv)
2022-02-12 13:44:15 +0100alp(~alp@user/alp)
2022-02-12 13:47:01 +0100DNH(~DNH@2a02:8108:1100:16d8:95db:50d7:7eec:328d) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-02-12 13:50:00 +0100whatsupdoc(uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2022-02-12 13:51:00 +0100zer0bitz(~zer0bitz@2001:2003:f74d:b800:1823:ee83:7026:65a9)
2022-02-12 13:52:23 +0100alx741(~alx741@157.100.197.240)
2022-02-12 13:55:48 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 13:58:27 +0100hololeap(~hololeap@user/hololeap) (Remote host closed the connection)
2022-02-12 13:58:43 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
2022-02-12 13:58:44 +0100fef(~thedawn@user/thedawn) (Remote host closed the connection)
2022-02-12 13:59:22 +0100fef(~thedawn@user/thedawn)
2022-02-12 13:59:38 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-02-12 13:59:49 +0100hololeap(~hololeap@user/hololeap)
2022-02-12 14:00:12 +0100fef(~thedawn@user/thedawn) (Client Quit)
2022-02-12 14:02:10 +0100xkuru(~xkuru@user/xkuru)
2022-02-12 14:04:42 +0100zer0bitz_(~zer0bitz@2001:2003:f74d:b800:1823:ee83:7026:65a9)
2022-02-12 14:07:50 +0100zer0bitz(~zer0bitz@2001:2003:f74d:b800:1823:ee83:7026:65a9) (Ping timeout: 250 seconds)
2022-02-12 14:08:45 +0100thevishy(~Nishant@2405:201:f005:c007:68d4:2777:c323:aa1b)
2022-02-12 14:12:26 +0100alx741(~alx741@157.100.197.240)
2022-02-12 14:13:26 +0100thevishy(~Nishant@2405:201:f005:c007:68d4:2777:c323:aa1b) (Client Quit)
2022-02-12 14:14:29 +0100zer0bitz_zer0bitz
2022-02-12 14:15:59 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 14:17:01 +0100deadmarshal(~deadmarsh@95.38.230.187) (Ping timeout: 256 seconds)
2022-02-12 14:19:50 +0100zeenk(~zeenk@2a02:2f04:a30d:1300:51a3:bcfc:6cda:9fc5) (Quit: Konversation terminated!)
2022-02-12 14:19:58 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 14:20:09 +0100coot(~coot@213.134.190.95)
2022-02-12 14:20:59 +0100jao(~jao@68.235.43.85)
2022-02-12 14:26:39 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 14:31:11 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 14:31:12 +0100ubert(~Thunderbi@p548c8cd6.dip0.t-ipconnect.de) (Quit: ubert)
2022-02-12 14:31:17 +0100tubogram4(~tubogram@user/tubogram)
2022-02-12 14:31:17 +0100Axman6(~Axman6@user/axman6)
2022-02-12 14:31:17 +0100calcium.libera.chat+o Axman6
2022-02-12 14:31:39 +0100ubert(~Thunderbi@p200300ecdf09947e2c357846a3b3453e.dip0.t-ipconnect.de)
2022-02-12 14:32:57 +0100wombat875(~wombat875@pool-72-89-24-154.nycmny.fios.verizon.net) (Ping timeout: 240 seconds)
2022-02-12 14:34:53 +0100coot(~coot@213.134.190.95) (Quit: coot)
2022-02-12 14:35:09 +0100jao(~jao@68.235.43.85) (Ping timeout: 256 seconds)
2022-02-12 14:35:10 +0100wombat875(~wombat875@pool-72-89-24-154.nycmny.fios.verizon.net)
2022-02-12 14:35:37 +0100Koen(~Koen@252.248.88.92.rev.sfr.net)
2022-02-12 14:35:41 +0100 <Koen> hi
2022-02-12 14:36:21 +0100 <Hecate> hi
2022-02-12 14:36:23 +0100 <Koen> I have a question about groupBy
2022-02-12 14:36:40 +0100 <Koen> the documentation says it compares adjacent elements: https://hackage.haskell.org/package/groupBy-0.1.0.0/docs/Data-List-GroupBy.html
2022-02-12 14:36:45 +0100alx741(~alx741@157.100.197.240)
2022-02-12 14:36:52 +0100 <Hecate> indeed it does
2022-02-12 14:36:56 +0100 <Koen> I tried their example groupBy (<=) [1,2,2,3,1,2,0,4,5,2]
2022-02-12 14:37:09 +0100 <Koen> and I get a different result than the documentation
2022-02-12 14:37:20 +0100 <Hecate> which version of the package are you importing?
2022-02-12 14:37:39 +0100cosimone(~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Read error: Connection reset by peer)
2022-02-12 14:37:41 +0100deadmarshal(~deadmarsh@95.38.230.187)
2022-02-12 14:38:03 +0100 <Koen> I have ghci 9.0.2; not sure about the version of the import
2022-02-12 14:38:15 +0100cosimone(~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20)
2022-02-12 14:38:22 +0100 <Hecate> Koen: what you're linking to is a package on Hackage, the community repository
2022-02-12 14:38:34 +0100 <Koen> okay
2022-02-12 14:38:35 +0100 <Hecate> so, you have to get that package as a dependency
2022-02-12 14:38:58 +0100 <Koen> ooooooh
2022-02-12 14:39:10 +0100 <Hecate> > This module provides an alternative definition for groupBy which does not require a transitive equivalence predicate.
2022-02-12 14:39:10 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 14:39:11 +0100 <lambdabot> <hint>:1:6: error: parse error on input ‘module’
2022-02-12 14:39:17 +0100 <Koen> yes
2022-02-12 14:39:18 +0100 <Hecate> looks like you've been using the original groupBy
2022-02-12 14:39:25 +0100 <Hecate> instead of the package you're looking at
2022-02-12 14:39:29 +0100 <Koen> fair enough
2022-02-12 14:40:42 +0100coot(~coot@213.134.190.95)
2022-02-12 14:44:29 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 14:44:39 +0100 <Arsen> what could cause a package (https://github.com/kowainik/tomland/) not to appear in stackage nightly anymore
2022-02-12 14:45:01 +0100 <geekosaur> usually it stopped building and they can't contact the maintainer to get it fixed
2022-02-12 14:46:27 +0100 <Arsen> oh it may be a revdep
2022-02-12 14:46:31 +0100 <Arsen> megaparsec is also gone
2022-02-12 14:47:14 +0100 <Arsen> wait, nvm, it's there
2022-02-12 14:47:57 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 240 seconds)
2022-02-12 14:49:53 +0100Ariakenom_(~Ariakenom@h-82-196-111-63.NA.cust.bahnhof.se) (Ping timeout: 256 seconds)
2022-02-12 14:50:05 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 14:50:08 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-02-12 14:50:59 +0100zer0bitz_(~zer0bitz@2001:2003:f74d:b800:78e9:2c9a:5431:d092)
2022-02-12 14:53:37 +0100absentia(~absentia@user/absentia) (Quit: WeeChat 3.4)
2022-02-12 14:54:37 +0100Megant(megant@user/megant) (Ping timeout: 240 seconds)
2022-02-12 14:55:02 +0100zer0bitz(~zer0bitz@2001:2003:f74d:b800:1823:ee83:7026:65a9) (Ping timeout: 260 seconds)
2022-02-12 14:55:41 +0100absentia(~absentia@user/absentia)
2022-02-12 14:56:07 +0100deadmarshal(~deadmarsh@95.38.230.187) (Ping timeout: 256 seconds)
2022-02-12 14:56:39 +0100Megant(megant@user/megant)
2022-02-12 14:57:01 +0100Ariakenom_(~Ariakenom@2001:9b1:efe:9d00:8937:70ea:8741:6137)
2022-02-12 14:57:28 +0100alx741(~alx741@157.100.197.240)
2022-02-12 14:58:09 +0100wolfshappen(~waff@irc.furworks.de) (Ping timeout: 256 seconds)
2022-02-12 14:58:45 +0100wolfshappen(~waff@irc.furworks.de)
2022-02-12 15:01:40 +0100shailangsa(~shailangs@host109-159-108-227.range109-159.btcentralplus.com)
2022-02-12 15:01:40 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 15:01:53 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Remote host closed the connection)
2022-02-12 15:01:55 +0100hololeap(~hololeap@user/hololeap) (Remote host closed the connection)
2022-02-12 15:01:58 +0100slowButPresent(~slowButPr@user/slowbutpresent)
2022-02-12 15:02:18 +0100pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-02-12 15:02:36 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 15:02:48 +0100shapr(~user@pool-173-73-44-186.washdc.fios.verizon.net)
2022-02-12 15:03:14 +0100hololeap(~hololeap@user/hololeap)
2022-02-12 15:04:34 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 15:05:06 +0100ober(~ober@c-73-68-74-41.hsd1.ma.comcast.net)
2022-02-12 15:05:27 +0100fef(~thedawn@user/thedawn)
2022-02-12 15:05:33 +0100ober(~ober@c-73-68-74-41.hsd1.ma.comcast.net) (Client Quit)
2022-02-12 15:05:54 +0100alp(~alp@user/alp) (Ping timeout: 250 seconds)
2022-02-12 15:06:08 +0100ubert(~Thunderbi@p200300ecdf09947e2c357846a3b3453e.dip0.t-ipconnect.de) (Quit: ubert)
2022-02-12 15:06:31 +0100ubert(~Thunderbi@p200300ecdf09947e2c357846a3b3453e.dip0.t-ipconnect.de)
2022-02-12 15:07:09 +0100Ariakenom__(~Ariakenom@h-82-196-111-63.NA.cust.bahnhof.se)
2022-02-12 15:08:42 +0100mikoto-chan(~mikoto-ch@213.177.151.239)
2022-02-12 15:09:39 +0100ubert(~Thunderbi@p200300ecdf09947e2c357846a3b3453e.dip0.t-ipconnect.de) (Remote host closed the connection)
2022-02-12 15:09:58 +0100ubert(~Thunderbi@p200300ecdf09947e2c357846a3b3453e.dip0.t-ipconnect.de)
2022-02-12 15:11:22 +0100Ariakenom_(~Ariakenom@2001:9b1:efe:9d00:8937:70ea:8741:6137) (Ping timeout: 260 seconds)
2022-02-12 15:14:13 +0100ubert(~Thunderbi@p200300ecdf09947e2c357846a3b3453e.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
2022-02-12 15:18:02 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7)
2022-02-12 15:18:28 +0100ubert(~Thunderbi@p548c8cd6.dip0.t-ipconnect.de)
2022-02-12 15:20:00 +0100alx741(~alx741@157.100.197.240)
2022-02-12 15:22:13 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7) (Ping timeout: 240 seconds)
2022-02-12 15:22:45 +0100waleee(~waleee@h-98-128-229-110.NA.cust.bahnhof.se)
2022-02-12 15:23:40 +0100xff0x(~xff0x@2001:1a81:524f:ad00:4eb7:4d9:8878:178f) (Ping timeout: 250 seconds)
2022-02-12 15:23:41 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 15:24:45 +0100xff0x(~xff0x@2001:1a81:524f:ad00:f091:6df4:fb78:756f)
2022-02-12 15:26:20 +0100 <janus> Arsen: aeson-2 just got merged into nightly so anything that isn't aeson-2 compatible is gone
2022-02-12 15:26:35 +0100Kaipi(~Kaiepi@156.34.47.253) (Remote host closed the connection)
2022-02-12 15:26:57 +0100 <janus> there is usually a comment in build-constraints.yaml that shows why the package was disabled
2022-02-12 15:27:06 +0100Kaipi(~Kaiepi@156.34.47.253)
2022-02-12 15:31:26 +0100vysn(~vysn@user/vysn) (Ping timeout: 260 seconds)
2022-02-12 15:31:56 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 15:32:55 +0100deadmarshal(~deadmarsh@95.38.230.187)
2022-02-12 15:35:48 +0100Graham31415(~Graham314@213.237.92.153) (Ping timeout: 256 seconds)
2022-02-12 15:40:15 +0100alx741(~alx741@157.100.197.240)
2022-02-12 15:40:53 +0100cheater(~Username@user/cheater) (Ping timeout: 256 seconds)
2022-02-12 15:41:33 +0100max22-(~maxime@2a01cb08833598002f7f8e76f08da118.ipv6.abo.wanadoo.fr)
2022-02-12 15:42:21 +0100__monty__(~toonn@user/toonn)
2022-02-12 15:43:33 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 15:47:56 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 15:51:37 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-02-12 15:53:33 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net) (Remote host closed the connection)
2022-02-12 15:53:57 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net)
2022-02-12 16:00:16 +0100alx741(~alx741@157.100.197.240)
2022-02-12 16:00:18 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com)
2022-02-12 16:00:24 +0100deadmarshal(~deadmarsh@95.38.230.187) (Ping timeout: 256 seconds)
2022-02-12 16:03:50 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 16:11:10 +0100bontaq(~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 256 seconds)
2022-02-12 16:12:51 +0100motherfsck(~motherfsc@user/motherfsck)
2022-02-12 16:17:58 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-02-12 16:19:06 +0100cosimone(~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Remote host closed the connection)
2022-02-12 16:20:18 +0100alx741(~alx741@157.100.197.240)
2022-02-12 16:22:11 +0100CiaoSen(~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-02-12 16:22:30 +0100mikoto-chan(~mikoto-ch@213.177.151.239) (Ping timeout: 256 seconds)
2022-02-12 16:23:02 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 16:23:57 +0100skewerr(spoonm@inaba.spoonm.org) (Read error: Connection reset by peer)
2022-02-12 16:24:10 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 16:24:10 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 16:24:10 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 16:27:20 +0100mikoto-chan(~mikoto-ch@213.177.151.239)
2022-02-12 16:28:39 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 250 seconds)
2022-02-12 16:29:24 +0100stiell(~stiell@gateway/tor-sasl/stiell) (Ping timeout: 276 seconds)
2022-02-12 16:30:14 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 260 seconds)
2022-02-12 16:41:00 +0100alx741(~alx741@157.100.197.240)
2022-02-12 16:42:40 +0100cosimone(~user@93-44-184-23.ip98.fastwebnet.it)
2022-02-12 16:42:55 +0100stiell(~stiell@gateway/tor-sasl/stiell)
2022-02-12 16:43:27 +0100motherfsck(~motherfsc@user/motherfsck)
2022-02-12 16:45:02 +0100kilolympus(~kilolympu@31.205.200.235)
2022-02-12 16:46:48 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 16:47:17 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 16:51:31 +0100ix(~ix@213.205.241.13)
2022-02-12 16:56:30 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 16:58:33 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 17:05:34 +0100alx741(~alx741@181.199.42.143)
2022-02-12 17:05:46 +0100xff0x(~xff0x@2001:1a81:524f:ad00:f091:6df4:fb78:756f) (Ping timeout: 245 seconds)
2022-02-12 17:06:13 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 17:07:21 +0100off^(~off@50.235.176.163)
2022-02-12 17:07:57 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 17:09:23 +0100mikoto-chan(~mikoto-ch@213.177.151.239) (Ping timeout: 250 seconds)
2022-02-12 17:11:27 +0100alx741(~alx741@181.199.42.143) (Read error: Connection reset by peer)
2022-02-12 17:11:34 +0100coot(~coot@213.134.190.95) (Quit: coot)
2022-02-12 17:12:03 +0100alx741(~alx741@157.100.197.240)
2022-02-12 17:14:28 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 17:16:28 +0100xff0x(~xff0x@2001:1a81:524f:ad00:23cf:423a:2190:173f)
2022-02-12 17:20:18 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 17:20:36 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7)
2022-02-12 17:21:11 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-02-12 17:21:44 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 17:24:57 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7) (Ping timeout: 240 seconds)
2022-02-12 17:27:40 +0100leungbk(~brian@cpe-142-129-149-172.socal.res.rr.com) (Ping timeout: 256 seconds)
2022-02-12 17:29:30 +0100pavonia(~user@user/siracusa) (Quit: Bye!)
2022-02-12 17:30:15 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 17:31:04 +0100alx741(~alx741@157.100.197.240)
2022-02-12 17:32:25 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 17:33:50 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 17:35:48 +0100Koen(~Koen@252.248.88.92.rev.sfr.net) (Quit: WeeChat 3.4)
2022-02-12 17:37:35 +0100Guest|46(~Guest|46@116.182.218.87.dynamic.jazztel.es)
2022-02-12 17:37:42 +0100Guest|46(~Guest|46@116.182.218.87.dynamic.jazztel.es) (Client Quit)
2022-02-12 17:39:53 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 17:41:48 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 17:46:56 +0100wombat875(~wombat875@pool-72-89-24-154.nycmny.fios.verizon.net) (Ping timeout: 256 seconds)
2022-02-12 17:47:17 +0100hgolden(~hgolden2@cpe-172-114-81-123.socal.res.rr.com) (Quit: Konversation terminated!)
2022-02-12 17:48:15 +0100hgolden(~hgolden2@cpe-172-114-81-123.socal.res.rr.com)
2022-02-12 17:50:33 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7)
2022-02-12 17:50:34 +0100alp(~alp@user/alp)
2022-02-12 17:51:33 +0100alx741(~alx741@157.100.197.240)
2022-02-12 17:52:01 +0100coot(~coot@213.134.190.95)
2022-02-12 17:53:34 +0100hgolden(~hgolden2@cpe-172-114-81-123.socal.res.rr.com) (Quit: Konversation terminated!)
2022-02-12 17:54:00 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 17:55:14 +0100hgolden(~hgolden2@cpe-172-114-81-123.socal.res.rr.com)
2022-02-12 17:58:04 +0100maxime_(~maxime@lfbn-ren-1-1026-62.w92-139.abo.wanadoo.fr)
2022-02-12 18:00:31 +0100max22-(~maxime@2a01cb08833598002f7f8e76f08da118.ipv6.abo.wanadoo.fr) (Ping timeout: 250 seconds)
2022-02-12 18:00:33 +0100dyeplexer(~dyeplexer@user/dyeplexer)
2022-02-12 18:12:14 +0100alx741(~alx741@157.100.197.240)
2022-02-12 18:16:58 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 18:21:59 +0100modnar(~modnar@shell.sonic.net)
2022-02-12 18:23:52 +0100mmhat(~mmh@55d4ce4d.access.ecotel.net) (Quit: WeeChat 3.4)
2022-02-12 18:24:30 +0100deadmarshal(~deadmarsh@95.38.230.187)
2022-02-12 18:24:37 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 18:24:37 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 18:24:37 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 18:26:08 +0100DNH(~DNH@2a02:8108:1100:16d8:95db:50d7:7eec:328d)
2022-02-12 18:28:52 +0100deadmarshal(~deadmarsh@95.38.230.187) (Ping timeout: 256 seconds)
2022-02-12 18:29:33 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 250 seconds)
2022-02-12 18:31:26 +0100mmhat(~mmh@55d4ce4d.access.ecotel.net)
2022-02-12 18:33:24 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 18:35:00 +0100alx741(~alx741@157.100.197.240)
2022-02-12 18:35:29 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 18:38:11 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 18:41:55 +0100kilolympus(~kilolympu@31.205.200.235) (Ping timeout: 256 seconds)
2022-02-12 18:46:16 +0100cheater(~Username@user/cheater)
2022-02-12 18:50:16 +0100hgolden(~hgolden2@cpe-172-114-81-123.socal.res.rr.com) (Quit: Konversation terminated!)
2022-02-12 18:51:58 +0100hgolden(~hgolden2@cpe-172-114-81-123.socal.res.rr.com)
2022-02-12 18:54:19 +0100motherfsck(~motherfsc@user/motherfsck) (Quit: quit)
2022-02-12 18:55:02 +0100alx741(~alx741@157.100.197.240)
2022-02-12 18:55:34 +0100econo(uid147250@user/econo)
2022-02-12 18:56:33 +0100burnsidesLlama(~burnsides@dhcp168-017.wadham.ox.ac.uk)
2022-02-12 18:58:29 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 18:59:05 +0100maxime__(~maxime@2a01cb0883359800facf81d49c6f1298.ipv6.abo.wanadoo.fr)
2022-02-12 19:01:49 +0100maxime_(~maxime@lfbn-ren-1-1026-62.w92-139.abo.wanadoo.fr) (Ping timeout: 256 seconds)
2022-02-12 19:02:18 +0100olle(~olle@i5E866D81.versanet.de)
2022-02-12 19:02:42 +0100little_mac(~little_ma@2601:410:4300:3ce0:f502:3f20:a1e5:5bdc)
2022-02-12 19:02:56 +0100 <olle> Provided you have a functional core that's kind of small and an imperative shell that's a bit too big, what are the available strategies to move code into the functional core?
2022-02-12 19:02:58 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 19:03:08 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 19:03:08 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 19:03:08 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 19:03:21 +0100CiaoSen(~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 250 seconds)
2022-02-12 19:05:30 +0100 <dminuoso> That question is a bit too general
2022-02-12 19:05:37 +0100 <dminuoso> But in princinple there's nothing wrong about imperative code
2022-02-12 19:06:06 +0100 <dminuoso> GHC largely consists of very imperative code for example
2022-02-12 19:07:38 +0100lavaman(~lavaman@98.38.249.169) (Ping timeout: 272 seconds)
2022-02-12 19:08:17 +0100 <olle> dminuoso: Problem with imperative code is it's hard to unit test and often requires a lot of mocking.
2022-02-12 19:08:20 +0100 <olle> Or scaffolding.
2022-02-12 19:08:47 +0100 <olle> Found one quote: "To get the most out of functional core we will tend to load everything beforehand and save everything afterwards, limiting the round-trips to the DB while risking loading data that is not used"
2022-02-12 19:08:51 +0100 <olle> http://martinsson-johan.blogspot.com/2021/01/hexagonal-architecture-vs-functional.html
2022-02-12 19:09:23 +0100 <dminuoso> olle: Functional code will not, necessarily, make things easier to test.
2022-02-12 19:09:52 +0100 <dminuoso> It's mostly a question of general code design.
2022-02-12 19:09:54 +0100 <olle> dminuoso: I think it will. :)
2022-02-12 19:10:10 +0100 <dminuoso> Based on what data?
2022-02-12 19:10:25 +0100 <olle> To be clear, I work professionally in PHP, so there's often a lot of mixing between side-effects and business logic.
2022-02-12 19:10:40 +0100 <dminuoso> First, the word "functional" is really not well defined, so its not even clear to me what you mean by "functional" as opposed to imperative
2022-02-12 19:10:42 +0100 <olle> dminuoso: Based on my experience in our legacy PHP code base.
2022-02-12 19:10:43 +0100 <dminuoso> They are orthogonal dimensions
2022-02-12 19:11:13 +0100 <olle> Yes, "funcaional" as loosely pure or referential transparent. Or even "possible to test without mocks".
2022-02-12 19:11:36 +0100 <dminuoso> Well, if you define functional as "possible to test without mocks", then clearly functional is possible to test without mocks.
2022-02-12 19:11:42 +0100 <olle> :)
2022-02-12 19:11:50 +0100 <dminuoso> But that's really just a tautology
2022-02-12 19:12:19 +0100 <dminuoso> olle: I still think they are orthogonal dimensions.
2022-02-12 19:12:56 +0100 <olle> dminuoso: My point of view is really pragmatic.
2022-02-12 19:13:07 +0100 <olle> In my experience, pure functions are easier to test.
2022-02-12 19:13:12 +0100 <dminuoso> There's a good reason why there's several dozen different styles of testing, and that's not because certain programming approaches limit your testing abilities.
2022-02-12 19:13:20 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 250 seconds)
2022-02-12 19:13:28 +0100 <dminuoso> It's simply because different problem domains or software solutions require different appraoches
2022-02-12 19:14:02 +0100 <dminuoso> Insisting you be able to have some percentage of unit testing coverage is just blindly asserting this is a useful thing to do
2022-02-12 19:14:15 +0100 <olle> Sure
2022-02-12 19:14:34 +0100 <olle> Or yes, I make the assumption that 50% test coverage is better than 0 :)
2022-02-12 19:14:45 +0100 <dminuoso> Unit testing is something that pertains to code design, and is somewhat unrelated to matters like functional or purity
2022-02-12 19:14:55 +0100 <dminuoso> If you can ship code as modular fragments, then unit testing becomes viable
2022-02-12 19:15:04 +0100alx741(~alx741@181.199.42.143)
2022-02-12 19:15:11 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 19:15:21 +0100 <janus> let's say you have a bunch of data, and a bunch of mutations. after the 6th mutation, there is an invariant that now is valid for the rest of the program. data structures usually come with invariants, so this is an opporunity to invent a name for this data structure
2022-02-12 19:15:27 +0100 <dminuoso> The requirement to mock has less to do with functional, but usually by intricate dependencies on stateful behavior you cant control
2022-02-12 19:15:53 +0100 <janus> but that doesn't seem specific to functional programming, that is just about inventing abstractions
2022-02-12 19:16:26 +0100 <dminuoso> I feel pure functional code enables reasoning on the programmer level, and it certainly can in *some* situations enable things like quickcheck.
2022-02-12 19:16:38 +0100 <olle> janus: Sure, each domain entity comes with validation and rules.
2022-02-12 19:17:09 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 19:17:38 +0100 <janus> functional programming just means that the intermediate states are created by functions that return the new state instead of mutating it in-place, right?
2022-02-12 19:17:45 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 276 seconds)
2022-02-12 19:17:45 +0100alx741(~alx741@181.199.42.143) (Read error: Connection reset by peer)
2022-02-12 19:17:58 +0100 <dminuoso> functional programming, again, has little to do with testing.
2022-02-12 19:17:59 +0100 <janus> so one could argue that something can be both functional and imperative, like GHC that was mentioned previously
2022-02-12 19:18:06 +0100 <olle> janus: Mutation is one side-effect, but there are others, like IO to file or db
2022-02-12 19:18:33 +0100 <dminuoso> Lets assume one definition of functional programming, namely that our software programming principle revolves around HOFs for the most part
2022-02-12 19:18:53 +0100 <dminuoso> HOFs dont make testing any less or more testable than say a class-based approach from Java.
2022-02-12 19:19:05 +0100 <dminuoso> In Java you instantiate things, and test these objects. In Haskell you test functinos.
2022-02-12 19:19:11 +0100 <olle> dminuoso: That's not a useful def for me, sorry. In "functional core, imperative shell", it's assume to seprate purity from IO-dense code.
2022-02-12 19:19:16 +0100 <dminuoso> They are not any different if you blur the details
2022-02-12 19:19:30 +0100 <dminuoso> olle: See, now that again has little to do with functional either.
2022-02-12 19:19:39 +0100 <dminuoso> It's really about modular software design.
2022-02-12 19:19:52 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 19:19:56 +0100 <olle> dminuoso: "Modular" can mean a lot of things.
2022-02-12 19:20:08 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-02-12 19:20:28 +0100 <Franciman> is there any blog post or reference speaking about laziness advantages?
2022-02-12 19:20:31 +0100 <Franciman> over strict evaluation
2022-02-12 19:21:02 +0100 <olle> Franciman: OCaml vs Haskell ;D
2022-02-12 19:21:17 +0100 <dminuoso> olle: Well, so unit testing is usually a matter of testing individual functions.
2022-02-12 19:21:20 +0100 <Franciman> where can i find it, olle ?
2022-02-12 19:21:32 +0100 <dminuoso> So if you write them modularly, you can usually test them without mocking anything.
2022-02-12 19:21:33 +0100 <Franciman> https://markkarpov.com/post/haskell-vs-ocaml.html ?
2022-02-12 19:21:33 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 19:21:39 +0100 <olle> Franciman: Google? I'm mostly joking, but I assume someone wrote about it...
2022-02-12 19:21:39 +0100 <dminuoso> And you dont have to test everything either
2022-02-12 19:21:47 +0100 <dminuoso> Say mocking a database is usually a silly thing to do
2022-02-12 19:22:09 +0100 <dminuoso> But if you insist on dragging 10,000 lines of transitive code around on a database dependency, then that's simply non-modular code.
2022-02-12 19:22:25 +0100 <dminuoso> It's some big ball of spaghetti where you didnt manage to split the business logic from the database interaction
2022-02-12 19:22:54 +0100 <monochrom> "Why Functional Programming Matters" by John Hughes is actually "why laziness matters". There is a paper version and a video version.
2022-02-12 19:23:00 +0100 <dminuoso> So to enable unit testing, you can instead have a bunch of particular business logic functions you test in unit tests
2022-02-12 19:23:02 +0100 <Franciman> oh nice, thanks monochrom
2022-02-12 19:23:41 +0100 <dminuoso> olle: Part of the problem may be that you're too focused on having complete coverage. But for unit tests its better to accept that you cant have that.
2022-02-12 19:23:51 +0100 <olle> dminuoso: That's given, but my question was about strategies to achieve such a divide.
2022-02-12 19:23:51 +0100 <dminuoso> So imagine what the core business logic is you want to test/assert.
2022-02-12 19:24:02 +0100 <dminuoso> That has nothing to do with purity
2022-02-12 19:24:15 +0100phma(~phma@host-67-44-208-247.hnremote.net) (Read error: Connection reset by peer)
2022-02-12 19:24:54 +0100 <dminuoso> If I have some `processAndDumpFile :: String -> IO ()`, I can simply run that in a test, and check the resulting file - turning it into `process :: String -> Dat` is certainly a bit more convenient for testing, but it's not fundamentally different
2022-02-12 19:25:01 +0100deadmarshal(~deadmarsh@95.38.230.187)
2022-02-12 19:25:11 +0100phma(~phma@host-67-44-208-185.hnremote.net)
2022-02-12 19:25:18 +0100 <dminuoso> it doesn't really have a meaningful difference to the way you test
2022-02-12 19:25:27 +0100 <olle> dminuoso: Full picture: A test suite based on mostly integrity tests is slooow.
2022-02-12 19:25:46 +0100jgeerds_(~jgeerds@55d4a547.access.ecotel.net)
2022-02-12 19:26:18 +0100 <dminuoso> olle: integration tests are not the same thing, they're orthogonal to unit tests. in integration tests you're usually more concerns whether interfaces interact with each other correctly, where in unit tests you can test individual parts for their internal correctness.
2022-02-12 19:26:23 +0100 <dminuoso> why not have both?
2022-02-12 19:26:50 +0100 <olle> dminuoso: Of course you'll have both. But unit tests can be part in the dev feedback loop. Integrity tests can't (easily).
2022-02-12 19:27:33 +0100dyeplexer(~dyeplexer@user/dyeplexer) (Remote host closed the connection)
2022-02-12 19:28:15 +0100 <dminuoso> Integration tests can be too, my point is just trading one for another is not a wise thing.
2022-02-12 19:28:53 +0100Natch(~natch@c-4db8e255.014-297-73746f25.bbcust.telenor.se) (Remote host closed the connection)
2022-02-12 19:29:12 +0100 <olle> dminuoso: It really can't be, tho. Integrity tests in our product takes ~10 min to run, and it will increase.
2022-02-12 19:29:15 +0100 <dminuoso> You dont do unit tests because "integration tests are less useful", you do unit tests to assert correctness of individual components. You do integration tests to assert correctness of interfaces and coupling between components. The latter helps finding a different class of bugs
2022-02-12 19:29:50 +0100 <dminuoso> So its not a "should I do 1) or 2)". It's rather a question of "how many unit tests, integration tests and system tests do we want"
2022-02-12 19:30:00 +0100 <dminuoso> And for what reason do you want any of these
2022-02-12 19:30:22 +0100 <olle> dminuoso: To restate my original question, it's like "which strategies can we use to increase the ratio of fast unit tests?"
2022-02-12 19:30:43 +0100vysn(~vysn@user/vysn)
2022-02-12 19:31:14 +0100 <dminuoso> olle: Keep a modular software design in mind *while* you write a component, with the explicit intent of unit testing it.
2022-02-12 19:31:32 +0100 <dminuoso> If you just do a lot of adhoc writing, yes testing becomes ahrd.
2022-02-12 19:32:59 +0100 <dminuoso> Our SDN compiler for example is constructed of a driver, multiple stages each consisting of phases. Its the drivers responsibility to execute stages, do a bit of housekeeping, and then feed artifacts into the next stage
2022-02-12 19:33:04 +0100 <dminuoso> each stage has zero knowledge of the next
2022-02-12 19:34:03 +0100 <dminuoso> that enables us to test stages in isolation as a kind of integration testing between the phases. then the phases have clear data boundaries, we have `N1 -> Comp N2`, `N2 -> Comp N3`, `N3 -> Comp N4`
2022-02-12 19:34:08 +0100 <olle> dminuoso: Duh, a compiler is a pipeline arch, easy to make pure :)
2022-02-12 19:34:24 +0100alx741(~alx741@157.100.197.240)
2022-02-12 19:34:25 +0100 <dminuoso> Sure so?
2022-02-12 19:34:39 +0100 <olle> Other domains are not so lucky :d
2022-02-12 19:34:46 +0100 <dminuoso> Take inspiration from that in code design.
2022-02-12 19:34:48 +0100 <olle> But in fact, a web request could be a pipeline too
2022-02-12 19:34:55 +0100 <dminuoso> Yes, that's the point Im trying to make!
2022-02-12 19:35:10 +0100 <dminuoso> You could think of a web request of having these stages:
2022-02-12 19:35:46 +0100 <dminuoso> Decode/route request > request data from database > process data > write data back to database > turn result into response > render response
2022-02-12 19:36:00 +0100kilolympus(~kilolympu@31.205.200.235)
2022-02-12 19:36:06 +0100 <dminuoso> It might not work as a law, but depending on your problem domain, you might be able to fit 90% of that into that form
2022-02-12 19:36:18 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 19:36:40 +0100 <olle> dminuoso: Yes, the problem is when side-effects depends on each other. "Check if file exists, if no, write one, if writing failed, return error"
2022-02-12 19:37:10 +0100 <olle> dminuoso: One strategy to move all side-effects in one place is to use events.
2022-02-12 19:37:19 +0100 <olle> Or a queue.
2022-02-12 19:37:40 +0100 <olle> I think Free monad and/or tagless-final are other such in Haskell community...?
2022-02-12 19:39:41 +0100 <olle> You want the functional core to "eat" the imperative shell during refactor, kind of :) Like an amoeba :D
2022-02-12 19:42:17 +0100Natch(~natch@c-4db8e255.014-297-73746f25.bbcust.telenor.se)
2022-02-12 19:48:22 +0100MatthiasG2(~matthias@i6DFA0382.versanet.de)
2022-02-12 19:51:36 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-02-12 19:52:37 +0100alx741(~alx741@181.199.42.143)
2022-02-12 19:55:07 +0100alx741(~alx741@181.199.42.143) (Read error: Connection reset by peer)
2022-02-12 19:56:27 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-02-12 19:56:56 +0100coot(~coot@213.134.190.95) (Quit: coot)
2022-02-12 19:58:36 +0100 <olle> I wonder if free monad can be replaced with a builder pattern in an OOP lang, like new IO.if(fn => DB.getUser).then(fn => save new username);
2022-02-12 19:59:17 +0100jgeerds_(~jgeerds@55d4a547.access.ecotel.net) (Ping timeout: 256 seconds)
2022-02-12 20:01:05 +0100o-90(~o-90@gateway/tor-sasl/o-90)
2022-02-12 20:01:49 +0100maxime__(~maxime@2a01cb0883359800facf81d49c6f1298.ipv6.abo.wanadoo.fr) (Ping timeout: 240 seconds)
2022-02-12 20:02:35 +0100 <EvanR> let me introduce you to jquery
2022-02-12 20:03:30 +0100zer0bitz_(~zer0bitz@2001:2003:f74d:b800:78e9:2c9a:5431:d092) (Ping timeout: 260 seconds)
2022-02-12 20:06:16 +0100 <olle> :D
2022-02-12 20:06:31 +0100Sgeo(~Sgeo@user/sgeo)
2022-02-12 20:07:17 +0100machinedgod(~machinedg@24.105.81.50) (Ping timeout: 240 seconds)
2022-02-12 20:08:33 +0100tzh(~tzh@c-24-21-73-154.hsd1.or.comcast.net)
2022-02-12 20:08:48 +0100 <EvanR> the previous discussion on atomic transactional I/O and "sending" into the internet: if you limit yourself to datagrams or raw IP, you can hypothetically arrange for a set of grams to be "all dispatched" or "cancel all that". But since the internet is technically unreliable, I'm not sure how nice that would be
2022-02-12 20:09:16 +0100 <EvanR> ignoring local unreliability with the OS
2022-02-12 20:09:33 +0100zer0bitz(~zer0bitz@2001:2003:f74d:b800:78e9:2c9a:5431:d092)
2022-02-12 20:09:42 +0100 <geekosaur> or not so technically, if you have my router :þ
2022-02-12 20:09:44 +0100 <olle> EvanR: Hm, is that related to our discussion? Or something else?
2022-02-12 20:09:56 +0100 <olle> No no, nevermind
2022-02-12 20:10:03 +0100 <EvanR> cloud haskell's "guarantee" that "if tcp is reliable, so is cloud haskell" or such
2022-02-12 20:11:57 +0100alx741(~alx741@157.100.197.240)
2022-02-12 20:14:18 +0100 <EvanR> olle, functional vs imperative is kind of missing a point, in haskell context you can have "pure code" (?) that looks imperative and so is just as easy to test
2022-02-12 20:15:14 +0100 <EvanR> IO is harder to test, because of IO, and to some extent because of I/O
2022-02-12 20:16:03 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 20:16:36 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net) (Remote host closed the connection)
2022-02-12 20:17:00 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net)
2022-02-12 20:17:12 +0100 <EvanR> IO became the main sewerage line of stuff they couldn't figure out how to do functionally so you can't even define it xD
2022-02-12 20:17:39 +0100coot(~coot@213.134.190.95)
2022-02-12 20:17:56 +0100 <EvanR> if nice haskell are mineral crystals IO is chernobylite
2022-02-12 20:19:22 +0100deadmarshal(~deadmarsh@95.38.230.187) (Ping timeout: 256 seconds)
2022-02-12 20:24:55 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net) (Ping timeout: 272 seconds)
2022-02-12 20:25:21 +0100o-90(~o-90@gateway/tor-sasl/o-90) (Ping timeout: 276 seconds)
2022-02-12 20:28:11 +0100 <sm> chernobylite eh.. I guess that's a no-good, very bad type of mineral
2022-02-12 20:31:33 +0100Sadeq(~Sadeq@151.235.4.11)
2022-02-12 20:32:00 +0100Sadeq(~Sadeq@151.235.4.11) (Client Quit)
2022-02-12 20:32:13 +0100akegalj(~akegalj@93-139-129-4.adsl.net.t-com.hr)
2022-02-12 20:32:23 +0100coot(~coot@213.134.190.95) (Quit: coot)
2022-02-12 20:32:59 +0100c209e6dc-4d76-47(~aditya@2601:249:4300:1296:195:dac6:592c:a55a)
2022-02-12 20:33:33 +0100maxime__(~maxime@2a01cb08833598009e7cfeb2ba15b673.ipv6.abo.wanadoo.fr)
2022-02-12 20:34:43 +0100alx741(~alx741@181.199.42.143)
2022-02-12 20:35:22 +0100fef(~thedawn@user/thedawn) (Remote host closed the connection)
2022-02-12 20:36:11 +0100 <olle> EvanR: "Imperative shell" is better named "effectful shell" or such
2022-02-12 20:36:58 +0100 <olle> I think that's the idea behind the pattern, at least.
2022-02-12 20:37:13 +0100jao(~jao@static-68-235-44-10.cust.tzulo.com)
2022-02-12 20:37:57 +0100 <olle> Not if the code contains for-loops :)
2022-02-12 20:39:03 +0100 <olle> It's complete shit that constructors in OOP always use the "new" keyword instead of FP convention of capital first letter. :d
2022-02-12 20:39:14 +0100 <olle> How are you supposed to do a DSL with that?
2022-02-12 20:39:15 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-02-12 20:39:25 +0100 <olle> new Add(new Int, new Int)
2022-02-12 20:39:46 +0100 <olle> I wonder if any OOP lang got rid of that...
2022-02-12 20:41:07 +0100koolazer(~koo@user/koolazer)
2022-02-12 20:42:02 +0100jao(~jao@static-68-235-44-10.cust.tzulo.com) (Ping timeout: 256 seconds)
2022-02-12 20:42:22 +0100alx741(~alx741@181.199.42.143) (Read error: Connection reset by peer)
2022-02-12 20:43:10 +0100coot(~coot@213.134.190.95)
2022-02-12 20:43:10 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 20:43:13 +0100jao(~jao@68.235.43.172)
2022-02-12 20:44:51 +0100ProfSimm(~ProfSimm@87.227.196.109)
2022-02-12 20:45:20 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 20:53:57 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 20:55:05 +0100 <monochrom> OO constructors and ADT constructors are different. Even opposite.
2022-02-12 20:55:44 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 20:56:40 +0100 <olle> Opposite? Pah!
2022-02-12 20:57:53 +0100coot(~coot@213.134.190.95) (Quit: coot)
2022-02-12 20:59:03 +0100alx741(~alx741@157.100.197.240)
2022-02-12 21:00:43 +0100 <EvanR> data dual to codata
2022-02-12 21:00:45 +0100cynomys(~cynomys@user/cynomys)
2022-02-12 21:02:18 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 21:02:18 +0100 <olle> They are used for similar use-cases.
2022-02-12 21:02:31 +0100 <olle> Mostly because FP don't have objects, and OOP don't have ADT
2022-02-12 21:02:47 +0100 <geekosaur> similar in some senses, different in others
2022-02-12 21:03:55 +0100 <monochrom> Two solutions to the same problem are always used in similar (even same) use cases. That doesn't mean they are the same solution.
2022-02-12 21:04:17 +0100 <monochrom> When I have the problem of boredom, I have two candidate solutions: AOE4, category theory.
2022-02-12 21:04:32 +0100 <monochrom> So suddenly AOE4 and category theory are similar. "similar".
2022-02-12 21:05:01 +0100vysn(~vysn@user/vysn) (Ping timeout: 240 seconds)
2022-02-12 21:05:03 +0100 <monochrom> Right? They are used for similar uses cases. When I want some fun.
2022-02-12 21:05:03 +0100 <maerwald> they're both a waste of time?
2022-02-12 21:05:08 +0100 <maerwald> ah
2022-02-12 21:05:08 +0100 <monochrom> haha
2022-02-12 21:05:16 +0100juhp(~juhp@128.106.188.82) (Ping timeout: 256 seconds)
2022-02-12 21:05:26 +0100 <monochrom> I don't object to "waste of time" really haha.
2022-02-12 21:06:47 +0100 <olle> I don't really care
2022-02-12 21:06:49 +0100 <olle> Do you?
2022-02-12 21:06:54 +0100 <monochrom> I do.
2022-02-12 21:06:56 +0100 <olle> :)
2022-02-12 21:07:17 +0100 <monochrom> People keep thinking that Haskell classes and Java interfaces are "similar". It's the same deal.
2022-02-12 21:07:30 +0100 <monochrom> They are opposite approaches to the same problem.
2022-02-12 21:07:50 +0100 <monochrom> They both solve the problem beautifully. That still doesn't mean they are similar.
2022-02-12 21:08:01 +0100juhp(~juhp@128.106.188.82)
2022-02-12 21:08:07 +0100 <monochrom> This is important in understand either notions properly.
2022-02-12 21:08:27 +0100 <monochrom> But then again you can object to proper understanding in the first place.
2022-02-12 21:10:27 +0100vglfr(~vglfr@coupling.penchant.volia.net) (Read error: Connection reset by peer)
2022-02-12 21:11:18 +0100vglfr(~vglfr@coupling.penchant.volia.net)
2022-02-12 21:12:12 +0100machinedgod(~machinedg@24.105.81.50)
2022-02-12 21:15:13 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 21:17:07 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 21:19:03 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net)
2022-02-12 21:19:20 +0100coot(~coot@213.134.190.95)
2022-02-12 21:19:21 +0100raehik1(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-02-12 21:20:34 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 256 seconds)
2022-02-12 21:20:41 +0100alx741(~alx741@157.100.197.240)
2022-02-12 21:24:18 +0100romesrf(~romes@44.190.189.46.rev.vodafone.pt)
2022-02-12 21:24:28 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 21:24:44 +0100romesrf(~romes@44.190.189.46.rev.vodafone.pt) (Client Quit)
2022-02-12 21:25:02 +0100romesrf(~romes@44.190.189.46.rev.vodafone.pt)
2022-02-12 21:25:27 +0100 <romesrf> o/
2022-02-12 21:25:43 +0100Unicorn_Princess(~Unicorn_P@46-54-248-191.static.kate-wing.si)
2022-02-12 21:34:03 +0100coot(~coot@213.134.190.95) (Quit: coot)
2022-02-12 21:35:16 +0100 <olle> Aaaah, passing around a state container might be a strategy
2022-02-12 21:35:25 +0100 <olle> Or, a container containing state shifting events to IO
2022-02-12 21:39:49 +0100alp(~alp@user/alp) (Ping timeout: 240 seconds)
2022-02-12 21:39:55 +0100 <ehammarstrom> what's a commonly used cli arg parser package?
2022-02-12 21:40:07 +0100 <geekosaur> optparse-applicative
2022-02-12 21:42:17 +0100alx741(~alx741@157.100.197.240)
2022-02-12 21:42:41 +0100neurocyte0917090(~neurocyte@IP-094046067096.dynamic.medianet-world.de)
2022-02-12 21:42:41 +0100neurocyte0917090(~neurocyte@IP-094046067096.dynamic.medianet-world.de) (Changing host)
2022-02-12 21:42:41 +0100neurocyte0917090(~neurocyte@user/neurocyte)
2022-02-12 21:45:46 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 21:47:33 +0100 <sm> or cmdargs
2022-02-12 21:47:46 +0100neurocyte0917090(~neurocyte@user/neurocyte) (Read error: Connection reset by peer)
2022-02-12 21:48:32 +0100neurocyte0917090(~neurocyte@IP-094046067096.dynamic.medianet-world.de)
2022-02-12 21:48:32 +0100neurocyte0917090(~neurocyte@IP-094046067096.dynamic.medianet-world.de) (Changing host)
2022-02-12 21:48:32 +0100neurocyte0917090(~neurocyte@user/neurocyte)
2022-02-12 21:49:21 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl)
2022-02-12 21:51:02 +0100`2jt(~jtomas@130.red-88-22-46.staticip.rima-tde.net) (Ping timeout: 272 seconds)
2022-02-12 21:51:29 +0100jao(~jao@68.235.43.172) (Ping timeout: 256 seconds)
2022-02-12 21:54:34 +0100 <dminuoso> merijn: Are you around?
2022-02-12 21:57:29 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 21:57:30 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 21:57:30 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 21:57:55 +0100coot(~coot@213.134.190.95)
2022-02-12 21:58:07 +0100ravella(~ravella@user/ryanavella)
2022-02-12 22:01:12 +0100romesrf(~romes@44.190.189.46.rev.vodafone.pt) (Read error: Connection reset by peer)
2022-02-12 22:01:53 +0100romesrf(~romes@44.190.189.46.rev.vodafone.pt)
2022-02-12 22:02:19 +0100alx741(~alx741@181.199.42.143)
2022-02-12 22:02:49 +0100raehik1(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 256 seconds)
2022-02-12 22:03:39 +0100akegalj(~akegalj@93-139-129-4.adsl.net.t-com.hr) (Quit: leaving)
2022-02-12 22:03:41 +0100neurocyte0917090(~neurocyte@user/neurocyte) (Ping timeout: 245 seconds)
2022-02-12 22:06:06 +0100 <maerwald> there's also commander-cli
2022-02-12 22:07:03 +0100alx741(~alx741@181.199.42.143) (Read error: Connection reset by peer)
2022-02-12 22:10:15 +0100_ht(~quassel@231-169-21-31.ftth.glasoperator.nl) (Remote host closed the connection)
2022-02-12 22:12:20 +0100c209e6dc-4d76-47(~aditya@2601:249:4300:1296:195:dac6:592c:a55a) (Quit: Konversation terminated!)
2022-02-12 22:13:06 +0100 <sm> interesting. Also docopt
2022-02-12 22:13:59 +0100neurocyte0917090(~neurocyte@IP-094046067096.dynamic.medianet-world.de)
2022-02-12 22:13:59 +0100neurocyte0917090(~neurocyte@IP-094046067096.dynamic.medianet-world.de) (Changing host)
2022-02-12 22:13:59 +0100neurocyte0917090(~neurocyte@user/neurocyte)
2022-02-12 22:14:04 +0100 <maerwald> yeah, I actually find optparse-applicative the least intuitive, but always ends up with it, because it appears to be the most powerful one
2022-02-12 22:20:59 +0100acidjnk(~acidjnk@p200300d0c705755700771b768146bc05.dip0.t-ipconnect.de)
2022-02-12 22:22:26 +0100merijn(~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 245 seconds)
2022-02-12 22:23:29 +0100sagax(~sagax_nb@user/sagax) (Quit: Konversation terminated!)
2022-02-12 22:28:37 +0100jao(~jao@static-68-235-44-70.cust.tzulo.com)
2022-02-12 22:30:05 +0100gehmehgeh(~user@user/gehmehgeh) (Remote host closed the connection)
2022-02-12 22:30:52 +0100gehmehgeh(~user@user/gehmehgeh)
2022-02-12 22:32:16 +0100jgeerds_(~jgeerds@55d4a547.access.ecotel.net)
2022-02-12 22:34:26 +0100 <sm> I thought cmdargs was equivalent, but you could be right
2022-02-12 22:34:39 +0100 <sm> one thing it can do is accept abbreviations of flags
2022-02-12 22:34:46 +0100 <sm> which I'm fond of
2022-02-12 22:35:25 +0100 <sm> and I definitely agree about non-intuitive o-a
2022-02-12 22:36:30 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 256 seconds)
2022-02-12 22:37:41 +0100 <energizer> when people talk about "effects", are they talking about control-flow manipulation like imperative languages' throw/yield/await statements, or about mutation, or about IO? or are those all somehow part of the same concept?
2022-02-12 22:38:17 +0100 <geekosaur> or not even those: Reader is an effect
2022-02-12 22:38:32 +0100 <energizer> ok well then i have no idea what effect means :)
2022-02-12 22:38:57 +0100 <energizer> i'm asking from the naive perspective (not being clever)
2022-02-12 22:41:16 +0100 <energizer> what should i read?
2022-02-12 22:41:39 +0100 <dminuoso> energizer: The word "effect" is something I think most Haskellers versed in the subject chose in a abstract way, it's very handwaving.
2022-02-12 22:41:49 +0100 <dminuoso> And it doesn't make sense to someone who hasn't reached a certain level of enlightenment
2022-02-12 22:42:18 +0100 <sm> it's a fine word, exact meaning depends on context as usual
2022-02-12 22:42:26 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-02-12 22:42:26 +0100wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-02-12 22:42:27 +0100wroathe(~wroathe@user/wroathe)
2022-02-12 22:42:27 +0100 <energizer> i gave some examples, are those all effects?
2022-02-12 22:42:48 +0100 <EvanR> anything that's not purely functional
2022-02-12 22:43:10 +0100 <geekosaur> hm? I think few peopke would exclude State as an effect
2022-02-12 22:43:29 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-02-12 22:43:30 +0100 <EvanR> at risk of raising more questions, purely functional programming is just using pure functions xD
2022-02-12 22:43:45 +0100 <dminuoso> energizer: So one view I adopt is to think of `(>>=) :: Monad m => m a -> (a -> m b) -> m b` as annotating `effect` results with further `effects`. And the reason I chose "effect" is because I get to "add" to it.
2022-02-12 22:44:14 +0100 <dminuoso> By "add" I mean the function of type `a -> m b` is under my control - I give it some type of "flavor", "extra context".. some kind of "effect"
2022-02-12 22:44:24 +0100 <dminuoso> That's opposed to say:
2022-02-12 22:45:13 +0100 <dminuoso> `extend :: Comonad w => (w a -> b) -> w a -> w b`, where `w` losely represents context/neighborhood Im given. I can sort of "inspect" the context/neighborhood that is being given to me
2022-02-12 22:45:14 +0100 <EvanR> a pure function is one which has no side effects more more relevant here is context independent. Unlike State
2022-02-12 22:45:17 +0100 <dminuoso> they are very suggestive terms
2022-02-12 22:45:29 +0100 <dminuoso> It doesn't mean anything concrete in particular
2022-02-12 22:45:42 +0100 <geekosaur> EvanR, State is pure functional. it just *looks* like it isn't
2022-02-12 22:45:48 +0100 <geekosaur> @unmtl State s a
2022-02-12 22:45:48 +0100 <lambdabot> s -> (a, s)
2022-02-12 22:46:06 +0100 <[exa]> "looks like impure" <- I can vote for this definition of effect
2022-02-12 22:46:26 +0100 <dminuoso> [exa]: What's the Identity effect? Reader effect?
2022-02-12 22:46:34 +0100 <dminuoso> neither looks impure at all
2022-02-12 22:46:46 +0100 <[exa]> identity is "no effect" so I'm okay there
2022-02-12 22:46:53 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 22:46:58 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 250 seconds)
2022-02-12 22:47:09 +0100 <[exa]> but reader magically grabs global values out of nowhere! :D
2022-02-12 22:47:10 +0100 <EvanR> "looks like" can be extended to everything, a computer is really an identifiable subset of a universal physical state
2022-02-12 22:47:22 +0100 <EvanR> but it looks like a discrete machine
2022-02-12 22:47:33 +0100 <dminuoso> [exa]: And what about Const?
2022-02-12 22:48:32 +0100 <EvanR> the difference between s -> (a,s) and State s a is basically the key difference
2022-02-12 22:49:19 +0100neurocyte0917090(~neurocyte@user/neurocyte) (Ping timeout: 272 seconds)
2022-02-12 22:49:19 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 272 seconds)
2022-02-12 22:50:28 +0100 <[exa]> dminuoso: same except the other way, it's collecting some monoid aside instead of doing computations
2022-02-12 22:50:59 +0100 <olle> energizer: malloc can be considered an effect too :)
2022-02-12 22:51:08 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 22:51:36 +0100 <dminuoso> Monad Complex
2022-02-12 22:51:44 +0100 <dminuoso> Huh wow, did not know this instance existed.
2022-02-12 22:51:56 +0100 <dminuoso> a :+ b >>= f = realPart (f a) :+ imagPart (f b)
2022-02-12 22:52:24 +0100 <energizer> this is helping, thanks
2022-02-12 22:52:36 +0100raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 250 seconds)
2022-02-12 22:52:55 +0100 <dminuoso> [exa]: So what effect is being encoded here? :P
2022-02-12 22:54:00 +0100 <[exa]> I'm trying to see if it looks like an effect
2022-02-12 22:54:28 +0100 <[exa]> (currently by looking at it in disbelief :D )
2022-02-12 22:55:29 +0100 <dminuoso> Perhaps the important thing is that "effect" is not some ultimate truth, it's just a mental model - and like all models it has its limits.
2022-02-12 22:55:43 +0100 <dminuoso> Trying to force an effect-interpretation here is not really helpful at all
2022-02-12 22:55:55 +0100 <olle> energizer: Effect is anything that's not part of the relation between input and output
2022-02-12 22:56:03 +0100 <olle> of a function
2022-02-12 22:56:10 +0100 <dminuoso> The only absolute truth we have is the laws of Monad, anything else is just fuzzy human interpretation
2022-02-12 22:56:24 +0100 <[exa]> dminuoso: that's basically I like the feels-like definition
2022-02-12 22:56:28 +0100 <Profpatsch> Duplicate instance declarations:
2022-02-12 22:56:30 +0100 <Profpatsch> instance FormatQuote a => PyF.PyFToString a
2022-02-12 22:56:32 +0100 <monochrom> I leave the definitions of "effect" and "algorithm" social rather than mathematical.
2022-02-12 22:56:32 +0100 <Profpatsch> instance [overlappable] [safe] Show t => PyF.PyFToString t
2022-02-12 22:56:35 +0100 <Profpatsch> I want to define the first instance
2022-02-12 22:56:44 +0100 <Profpatsch> Is there a way to make GHC accept it?
2022-02-12 22:56:47 +0100 <olle> Note that being pure is not the same thing as referential transparency
2022-02-12 22:57:07 +0100 <dminuoso> Profpatsch: The sane way is to use a newtype wrapper
2022-02-12 22:57:12 +0100 <olle> A fib function can cache its result on file, silent on failure
2022-02-12 22:57:22 +0100[exa]imagines ComplexT
2022-02-12 22:57:39 +0100 <olle> It'd be referential transparent - always same output on same input - but not pure - file IO.
2022-02-12 22:57:39 +0100 <Profpatsch> dminuoso: I have a feeling deriving via would come in handy here
2022-02-12 22:57:54 +0100 <dminuoso> Profpatsch: I dont think that will help you.
2022-02-12 22:58:05 +0100 <Profpatsch> dminuoso: basically I want to say “whenever your type implements this typeclass I can also give you an implementation for this other typeclass
2022-02-12 22:58:28 +0100 <monochrom> [exa]: Did you know that "data Pair a = P a a" is very much like Bool->a? :)
2022-02-12 22:58:57 +0100 <[exa]> monochrom: yes that's even isomorphic in that encoding (was it scott encoding?)
2022-02-12 22:59:00 +0100 <monochrom> All the way down to how their return's and >>='s correspond.
2022-02-12 22:59:38 +0100 <monochrom> No I think that's just "Pair is a representable functor, represented by Bool".
2022-02-12 22:59:46 +0100 <dminuoso> Profpatsch: The problem is, according to GHC, `instance Show t => PyF.PyFToString t` already matches *all* instances.
2022-02-12 22:59:53 +0100 <dminuoso> Irrespective of whether a Show instance exists, even
2022-02-12 22:59:54 +0100 <monochrom> So now "data Complex a = a :+ a" is just Pair in infix syntax.
2022-02-12 22:59:59 +0100 <[exa]> I'm probably getting too carried away by the algebra semantic of complex numbers, yes.
2022-02-12 23:00:19 +0100 <dminuoso> Profpatsch: That is, for instance selection that will *always* match.
2022-02-12 23:00:22 +0100analognoise(~analognoi@185.229.59.36)
2022-02-12 23:00:45 +0100 <dminuoso> You could use {-# OVERLAPPING #-} in your instance, but you might want to weight the consequences of that.
2022-02-12 23:00:49 +0100 <[exa]> anyway thanks guys this is a nice find. :]
2022-02-12 23:01:24 +0100analognoise(~analognoi@185.229.59.36) (Max SendQ exceeded)
2022-02-12 23:01:43 +0100 <Profpatsch> dminuoso: yeah, that’s what I was expecting
2022-02-12 23:01:53 +0100analognoise(~analognoi@185.229.59.36)
2022-02-12 23:02:24 +0100 <dminuoso> Ah but hold on, I think that wont work
2022-02-12 23:02:30 +0100 <dminuoso> Because your instance is not any more specific.
2022-02-12 23:02:42 +0100 <dminuoso> So you're out of luck. Either use a separate typeclass or a newtype wrapper
2022-02-12 23:03:03 +0100 <dminuoso> (overlapping wouldnt do anything extra, since the other instance already is overlappable)
2022-02-12 23:03:32 +0100gehmehgeh(~user@user/gehmehgeh) (Quit: Leaving)
2022-02-12 23:04:21 +0100eldritch_(~eldritch@user/eldritch/x-9272577) (Quit: bye)
2022-02-12 23:04:21 +0100glider(~glider@user/glider) (Quit: ZNC - https://znc.in)
2022-02-12 23:04:22 +0100anderson(~ande@user/anderson) (Quit: bye)
2022-02-12 23:05:43 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 23:06:10 +0100alx741(~alx741@157.100.197.240)
2022-02-12 23:07:21 +0100pavonia(~user@user/siracusa)
2022-02-12 23:07:37 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 23:10:23 +0100Erutuon(~Erutuon@user/erutuon)
2022-02-12 23:10:44 +0100eldritch_(~eldritch@user/eldritch/x-9272577)
2022-02-12 23:11:31 +0100 <energizer> do "algebraic effects" and "effect system" refer to the same thing?
2022-02-12 23:12:23 +0100glider(~glider@user/glider)
2022-02-12 23:12:24 +0100 <olle> energizer: No
2022-02-12 23:12:35 +0100 <olle> Assuming "effect system" is the same as "typed effects"
2022-02-12 23:12:53 +0100 <olle> OCaml will have algebraic effects but not typed effects, iirc (in the next release)
2022-02-12 23:13:57 +0100 <energizer> what is the difference?
2022-02-12 23:15:36 +0100ProfSimm(~ProfSimm@87.227.196.109) (Remote host closed the connection)
2022-02-12 23:15:51 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 23:16:15 +0100unyu(~pyon@user/pyon) (Quit: WeeChat 3.4)
2022-02-12 23:16:26 +0100 <olle> energizer: typed effects mean that all side-effects of a function will be part of the function's signature, in some way
2022-02-12 23:16:32 +0100 <olle> That's kind of already the case in Haskell
2022-02-12 23:16:40 +0100anderson(~ande@user/anderson)
2022-02-12 23:16:58 +0100 <olle> energizer: https://www.janestreet.com/tech-talks/effective-programming/
2022-02-12 23:17:06 +0100 <olle> There's a talk on algebraic effects.
2022-02-12 23:17:15 +0100 <olle> Wait no
2022-02-12 23:17:55 +0100 <olle> energizer: This one: https://github.com/ocamllabs/ocaml-effects-tutorial
2022-02-12 23:18:55 +0100 <olle> Not sure how that's different from `yield` in PHP and JS, honestly.
2022-02-12 23:19:19 +0100 <energizer> "They generalise common abstractions such as exceptions, generators, asynchronous I/O, or concurrency, as well as other seemingly esoteric programming abstractions such as transactional memory and probabilistic computations."
2022-02-12 23:20:09 +0100 <energizer> sure. python's `yield from` and `await` are really the same thing and i can see exceptions being related too
2022-02-12 23:20:20 +0100unyu(~pyon@user/pyon)
2022-02-12 23:20:45 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:20:58 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:21:06 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:21:18 +0100 <olle> energizer: For a working lang with typed effects, see Koka 2 from Microsoft research
2022-02-12 23:21:21 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:21:28 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:21:34 +0100 <olle> And maybe F* (fstar lang)
2022-02-12 23:21:42 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:21:47 +0100 <energizer> the stuff we were talking about earlier, was that 'typed effects'?
2022-02-12 23:21:49 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:22:04 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:22:11 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:22:25 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:22:32 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:22:36 +0100 <olle> energizer: functional core?
2022-02-12 23:22:47 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:22:49 +0100 <energizer> no i was asking what 'effects' means
2022-02-12 23:22:54 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:23:00 +0100 <olle> Ah, no, that's not the same
2022-02-12 23:23:08 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:23:15 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:23:18 +0100 <olle> A function can be pure or effectful without affecting its function signature (in a language without typed effects)
2022-02-12 23:23:30 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:23:37 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:23:50 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:23:58 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:24:13 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:24:19 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:24:34 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:24:41 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:24:55 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:25:02 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:25:17 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:25:24 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:25:38 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:25:45 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:26:00 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:26:07 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:26:12 +0100 <olle> I think in Haskell, side-effects will always change the signature, including the IO monad and others
2022-02-12 23:26:21 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:26:22 +0100 <olle> Since the lang is pure :)
2022-02-12 23:26:28 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:26:37 +0100 <olle> Even randomisation?
2022-02-12 23:26:43 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:26:50 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:27:04 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:27:11 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:27:13 +0100 <energizer> effects, typed effects, algebraic effects, effect handlers, none of these mean the same thing
2022-02-12 23:27:26 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:27:33 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:27:35 +0100 <geekosaur> olle, has little to do with purity and everything to do with strong typing
2022-02-12 23:27:47 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:27:55 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:28:02 +0100 <energizer> , right?
2022-02-12 23:28:09 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:28:10 +0100 <olle> geekosaur: Hm, no? Strong/weak types is not related to effects, I think.
2022-02-12 23:28:16 +0100zebrag(~chris@user/zebrag)
2022-02-12 23:28:16 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:28:24 +0100 <geekosaur> hold on
2022-02-12 23:28:26 +0100ChanServ+o geekosaur
2022-02-12 23:28:31 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:28:38 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:28:52 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:28:59 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:29:00 +0100geekosaur+b *!*@98.38.249.169$##fix-your-connection
2022-02-12 23:29:26 +0100 <geekosaur> pity I can't make my client do that automagically
2022-02-12 23:29:28 +0100geekosaur-o geekosaur
2022-02-12 23:29:50 +0100 <geekosaur> olle, not directly, but if a language is strongly typed then effects will show in the type
2022-02-12 23:29:59 +0100 <geekosaur> if it is weakly typed then they won't
2022-02-12 23:30:24 +0100 <geekosaur> *how* they show depends on implementation
2022-02-12 23:30:37 +0100 <olle> geekosaur: Not sure everyone would agree on that def :)
2022-02-12 23:30:55 +0100 <olle> OCaml folks would call OCaml strongly typed, e.g.
2022-02-12 23:32:12 +0100 <geekosaur> but it is also not directly purity. it is a combination: you must advertise impurity in the type in Haskell. you don't in OCaml
2022-02-12 23:32:25 +0100alx741(~alx741@157.100.197.240)
2022-02-12 23:32:40 +0100 <geekosaur> but you can advertise purity even in C
2022-02-12 23:32:52 +0100 <geekosaur> soit's not just purity
2022-02-12 23:33:45 +0100 <olle> wat
2022-02-12 23:33:52 +0100 <olle> what does that mean, purity in C?
2022-02-12 23:36:11 +0100 <geekosaur> no side effects. gcc/clang use it for optimization
2022-02-12 23:36:18 +0100 <olle> geekosaur: Link?
2022-02-12 23:36:35 +0100 <geekosaur> but it's up to you to use it and I think the ocmpiler just trusts you
2022-02-12 23:37:14 +0100 <olle> Yeah, that's not "strong" typing in any sense xD
2022-02-12 23:37:30 +0100 <geekosaur> here's an example https://stackoverflow.com/questions/29117836/attribute-const-vs-attribute-pure-in-gnu-c
2022-02-12 23:37:34 +0100 <olle> But C was always weak + static
2022-02-12 23:38:05 +0100 <olle> Yeah, just a compiler attribute
2022-02-12 23:39:23 +0100 <geekosaur> right, but it does point up that purity by itself doesn't prove anything
2022-02-12 23:39:35 +0100 <geekosaur> you need both for at least haskell-style effects
2022-02-12 23:40:08 +0100 <geekosaur> and C is not strongly typed, so yes, it's an attribute instead of a type
2022-02-12 23:40:36 +0100 <olle> Considering how esoteric typed effects are, I'd be suprised to see it in a weakly typed lang :)
2022-02-12 23:41:40 +0100 <geekosaur> whereas in ocaml you cna't easily tell the difference between an "effect" and normal code except by inspecting the function in question
2022-02-12 23:41:59 +0100alx741(~alx741@157.100.197.240) (Read error: Connection reset by peer)
2022-02-12 23:42:18 +0100michalz(~michalz@185.246.204.65) (Remote host closed the connection)
2022-02-12 23:42:42 +0100 <olle> Sure
2022-02-12 23:42:54 +0100 <olle> Same goes for all langs except Haskell :)
2022-02-12 23:44:08 +0100ChanServ+o litharge
2022-02-12 23:44:09 +0100litharge-bo *!*@98.38.249.169$##fix-your-connection litharge
2022-02-12 23:44:20 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:44:27 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:44:41 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:44:49 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:45:04 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:45:11 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:45:19 +0100ChanServ+o monochrom
2022-02-12 23:45:24 +0100lavaman(~lavaman@98.38.249.169)
2022-02-12 23:45:30 +0100monochrom+b *!*@98.38.249.169$##fix-your-connection
2022-02-12 23:45:32 +0100lavaman(~lavaman@98.38.249.169) (Remote host closed the connection)
2022-02-12 23:45:38 +0100 <sprout> how pure is a state monad?
2022-02-12 23:45:52 +0100 <geekosaur> it's just s -> (a,s)
2022-02-12 23:46:00 +0100monochrom-o monochrom
2022-02-12 23:46:12 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds)
2022-02-12 23:46:23 +0100 <sprout> sure, but now I've got assignment in a pure language
2022-02-12 23:46:31 +0100 <geekosaur> no impurity to it at all, it just hides that it's passing the "state" in and getting it back afterward
2022-02-12 23:46:59 +0100 <sprout> and c hides it's pure underneath?
2022-02-12 23:47:24 +0100 <olle> C just flashes all its dirty effects
2022-02-12 23:47:36 +0100 <olle> Like a hobo on crystal meth
2022-02-12 23:47:52 +0100 <sprout> a true programming perverts language!
2022-02-12 23:48:13 +0100mon_aaraj(~MonAaraj@user/mon-aaraj/x-4416475)
2022-02-12 23:48:35 +0100bontaq(~user@ool-45779fe5.dyn.optonline.net)
2022-02-12 23:50:41 +0100justsomeguy(~justsomeg@user/justsomeguy)
2022-02-12 23:51:01 +0100eggplantade(~Eggplanta@2600:1700:bef1:5e10:ad86:5044:3d0e:26e7) (Remote host closed the connection)
2022-02-12 23:55:23 +0100 <hpc> in fact, C likes spreading its dirty effects even to clean parts of the code
2022-02-12 23:55:30 +0100alp(~alp@user/alp)
2022-02-12 23:55:45 +0100 <hpc> if you write a potentially integer-overflowing addition in one function, gcc might decide to completely ignore an unrelated if-then-else in another function
2022-02-12 23:56:03 +0100 <hpc> hope you have good logging, and also hope that your logging hasn't been gcc'd away as well
2022-02-12 23:56:16 +0100 <romesrf> haahah olle
2022-02-12 23:56:51 +0100 <geekosaur> "gcc'd away"
2022-02-12 23:57:46 +0100 <olle> geekosaur: The nerdy sequal to "Gone with the wind" :D
2022-02-12 23:57:58 +0100 <hpc> gone with the win32
2022-02-12 23:58:04 +0100 <olle> ^^ +1