Logs on 2023-02-08 (liberachat/#haskell)
| 00:00:19 | <geekosaur> | I generally recommend using the latest released cabal due to bugs in older versions (I have in particular seen problems with cabal 3.4 and `setup-type: configure`) |
| 00:00:38 | → | opticblast joins (~Thunderbi@172.58.82.191) |
| 00:00:43 | × | Tuplanolla quits (~Tuplanoll@91-159-68-152.elisa-laajakaista.fi) (Ping timeout: 248 seconds) |
| 00:01:07 | <lechner> | geekosaur / i'm trying. is this remark specific to Guix, then? https://github.com/guix-mirror/guix/blob/master/gnu/packages/haskell-apps.scm#L94-L95 |
| 00:02:13 | <geekosaur> | technically it's false as long as they have compatibility. practically I think cabal-install may reject it just because it doesn't know they retain backward compatibility? |
| 00:02:37 | <lechner> | Guix may also have bootstrapping issues, btw |
| 00:02:39 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 268 seconds) |
| 00:03:14 | <geekosaur> | and they avoid trying to hardcode too much "magical" knowledge into it, so there's not much between "freely upradeable" and "bound to ghc" |
| 00:04:16 | → | ddellacosta joins (~ddellacos@146.70.165.170) |
| 00:04:27 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 255 seconds) |
| 00:05:21 | <geekosaur> | hm, okay, that might actually be a guix requirement because it can't keep track of two versions of Cabal at the same time |
| 00:05:30 | → | czy joins (~user@host-140-28.ilcub310.champaign.il.us.clients.pavlovmedia.net) |
| 00:06:23 | <geekosaur> | cabal-install has no trouble with it; I've definitely used much newer versions of cabal with older ghcs, and cabal(-install) drags along a newer Cabal |
| 00:07:08 | <lechner> | i see. what's in Cabal, please, and why does it also ship with GHC? |
| 00:07:20 | <geekosaur> | if this weren't the case I couldn't be using cabal 3.10 prerelease with ghc 9.2.5 |
| 00:07:28 | <geekosaur> | Cabal is the package manager library |
| 00:07:58 | <geekosaur> | so ghc needs it to use package dbs |
| 00:08:28 | <geekosaur> | it is not what determines build plans and the like; that lives in cabal-install |
| 00:08:46 | × | sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Quit: No Ping reply in 180 seconds.) |
| 00:08:49 | <lechner> | how does the ordinary Cabal ecosystem know how to find the right one? |
| 00:09:31 | <geekosaur> | ghc always uses the one that comes with it. the rest of the ecosystem can use that or a different version; backward compatibility is very well established and maintained |
| 00:10:03 | → | sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) |
| 00:10:22 | <geekosaur> | as I mentioned earlier, cabal-install uses the corresponding Cabal library to maintain package dbs; ghc can access those without requiring the same Cabal version |
| 00:11:03 | <lechner> | well, my question was a little bit more technical in the sense that i have to figure out if i can somehow replicate that in Guix. Do you know if it would work in Nix? |
| 00:14:10 | <geekosaur> | that I don't. but I think that's part of why cabal-install has a nix mode, instead of the other way around? |
| 00:14:22 | <geekosaur> | probably have to ask sclv |
| 00:14:33 | <geekosaur> | (sorry for ping) |
| 00:16:05 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 00:19:23 | × | czy quits (~user@host-140-28.ilcub310.champaign.il.us.clients.pavlovmedia.net) (Quit: ERC 5.4.1 (IRC client for GNU Emacs 30.0.50)) |
| 00:20:02 | → | czy joins (~user@host-140-28.ilcub310.champaign.il.us.clients.pavlovmedia.net) |
| 00:21:23 | → | king_gs joins (~Thunderbi@187.201.41.239) |
| 00:24:48 | × | tdwdiod^ quits (~tdwdiod@c-24-30-76-89.hsd1.ga.comcast.net) (Remote host closed the connection) |
| 00:25:12 | → | czy` joins (~user@host-140-28.ilcub310.champaign.il.us.clients.pavlovmedia.net) |
| 00:25:33 | <sclv> | i don’t understand the question |
| 00:29:49 | × | patrl quits (~patrl@user/patrl) (Quit: WeeChat 3.8) |
| 00:31:40 | × | bhall quits (~brunohall@195.147.207.136) (Ping timeout: 260 seconds) |
| 00:32:32 | <lechner> | sclv / Hi, I'd like to update Cabal in Guix but found this remark https://github.com/guix-mirror/guix/blob/ccf742f120452acf587d16e40adea570d15169c4/gnu/packages/haskell-apps.scm#L94-L95 |
| 00:33:40 | <sclv> | i think guix like nix probably has the requirement that there is Only One Version of a package at any given time. |
| 00:34:08 | <sclv> | since Cabal-the-library ships with ghc, and since a new cabal-the-app requires being against a new cabal-the-library, then this would be the roadblock, sadly |
| 00:34:50 | <sclv> | i think the nix folks have some way to "jailbreak" out of that problem, but idk what it might be |
| 00:34:58 | <jackdk> | out of interest, what is the guix word for "nixpkgs"? By which I mean, the giant collection of .scm files |
| 00:36:17 | <lechner> | jackdk / i think it's all part of the Guix repo https://github.com/guix-mirror/guix/tree/master/gnu/packages |
| 00:36:36 | <jackdk> | sclv: jailbreaking a cabal package means removing its bounds, used when a package compiles against newer (or older, I guess) versions of its deps and a metadata revision or new release has not trickled down to the hackage snapshot yet. I can't see it helping much here if guix is also doing the Only One Version Of A Package thing |
| 00:36:54 | <sclv> | yeah, i thought nix might have another hack on top of that, but idk. |
| 00:37:18 | <jackdk> | (This is the big advantage of IOG's "haskell.nix" project, but that's a very heavy piece of machinery which I use only when I need cross compiling, static linking, or I _must_ use the output of the cabal solver to select deps.) |
| 00:39:40 | × | aisa quits (~aisa@user/aisa) (Ping timeout: 252 seconds) |
| 00:39:57 | → | aljer joins (~jonathon@2601:5c1:4503:8da0:7130:73a8:a627:b376) |
| 00:48:05 | <lechner> | what are the mechanism and the reason for which and by which Guix does the Only One Version thing. What is different to an ordinary setup, please? |
| 00:48:53 | <geekosaur> | the main reason would be avoiding the diamond dependency problem |
| 00:49:03 | × | aljer quits (~jonathon@2601:5c1:4503:8da0:7130:73a8:a627:b376) (Ping timeout: 248 seconds) |
| 00:49:22 | <geekosaur> | (library A uses version 1, library B uses version 2, you try to depend on both library A and library B -> disaster) |
| 00:50:10 | <geekosaur> | s/version ./& of library C/g |
| 00:52:02 | → | tabemann joins (~tabemann@2600:1700:7990:24e0:ef07:7078:7b84:e5fd) |
| 00:54:40 | <geekosaur> | note that this can happen even with Cabal because the linker is being asked to link two different versions of the same library, their symbols will conflict. the linker has no clue that it can safely ignore the older version and link everything against the newer one; this is not at all common |
| 00:56:22 | → | wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com) |
| 00:56:22 | × | wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host) |
| 00:56:22 | → | wroathe joins (~wroathe@user/wroathe) |
| 00:56:23 | <geekosaur> | so to keep a consistent package store, guix (or nix, or debian, or etc.) has to pick one "golden" version of each library |
| 01:00:22 | <geekosaur> | cabal handles this differently: you can have multiple versions, but it has to build multiple versions of dependencies against them as needed to satisfy your dependencies. |
| 01:00:54 | <geekosaur> | this takes a lot of space, which is why you'll often see people complaining about cabal (or stack, which does the same thing) package stores getting huge |
| 01:01:20 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds) |
| 01:05:37 | × | albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection) |
| 01:11:44 | → | albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8) |
| 01:13:49 | → | freeside joins (~mengwong@103.252.202.170) |
| 01:14:30 | → | dsrt^ joins (~dsrt@c-24-30-76-89.hsd1.ga.comcast.net) |
| 01:18:10 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 252 seconds) |
| 01:20:25 | × | king_gs quits (~Thunderbi@187.201.41.239) (Read error: Connection reset by peer) |
| 01:20:30 | → | king_gs1 joins (~Thunderbi@2806:103e:29:1779:904b:7f43:decf:5c51) |
| 01:20:49 | → | aljer joins (~jonathon@2601:5c1:4503:8da0:7130:73a8:a627:b376) |
| 01:22:47 | king_gs1 | is now known as king_gs |
| 01:24:36 | × | cheater quits (~Username@user/cheater) (Read error: Connection reset by peer) |
| 01:24:45 | × | troydm quits (~troydm@user/troydm) (Ping timeout: 260 seconds) |
| 01:24:59 | × | aljer quits (~jonathon@2601:5c1:4503:8da0:7130:73a8:a627:b376) (Ping timeout: 248 seconds) |
| 01:25:21 | → | cheater joins (~Username@user/cheater) |
| 01:26:23 | × | ddellacosta quits (~ddellacos@146.70.165.170) (Ping timeout: 248 seconds) |
| 01:27:03 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 01:27:46 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 01:30:40 | → | bhall joins (~brunohall@195.147.207.136) |
| 01:33:31 | ← | Henson parts (~kvirc@207.136.101.195) (No boundaries on the net!) |
| 01:34:53 | × | notzmv quits (~zmv@user/notzmv) (Ping timeout: 246 seconds) |
| 01:39:23 | × | xff0x quits (~xff0x@ai081074.d.east.v6connect.net) (Ping timeout: 248 seconds) |
| 01:45:01 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 268 seconds) |
| 01:47:45 | → | freeside joins (~mengwong@103.252.202.170) |
| 01:49:26 | → | harveypwca joins (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) |
| 01:52:11 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds) |
| 01:52:55 | → | werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) |
| 01:52:58 | → | aljer joins (~jonathon@2601:5c1:4503:8da0:7130:73a8:a627:b376) |
| 01:52:59 | × | beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Ping timeout: 260 seconds) |
| 01:55:11 | × | kurbus quits (~kurbus@user/kurbus) (Quit: Client closed) |
| 01:55:16 | → | ghostbuster joins (~admin@user/ghostbuster) |
| 01:56:00 | <ghostbuster> | is haskell a good first functional language for an experience C/C++ programmer? |
| 01:56:41 | <slack1256> | Good as any. |
| 01:57:05 | <slack1256> | I don't think much will carry over from C/C++ though. That is probably for the best. |
| 01:58:07 | → | notzmv joins (~zmv@user/notzmv) |
| 01:58:21 | <aljer> | in my opinion it's a better choice than a Lisp dialect because of static typing |
| 01:58:59 | <dsal> | It's a bit easier without C or C++ experience, IMO. |
| 01:59:27 | <ghostbuster> | dsal: too late for that unfortunately |
| 01:59:35 | <davean> | I think a *medium* amount of C/C++ is the worst |
| 01:59:51 | <davean> | if you have a lot of C/C++ experience you probably just invent functional programming yourself. |
| 02:00:18 | <aljer> | agreed with dsal - FP is easier without any OOP experience |
| 02:00:33 | <davean> | (Thats how the community I came over with got here) |
| 02:00:54 | <ghostbuster> | when i said C/C++ i really meant mostly C - not so much OOP |
| 02:00:56 | slack1256 | came here cause the cute drawing on LYAH |
| 02:00:57 | <dsal> | It's not just OOP. A lot of it is trying to address concerns in what you're used to. |
| 02:01:54 | <dsal> | e.g., if all you know is C, you may be predisposed to worry about the wrong things. |
| 02:02:07 | <aljer> | ah, good point |
| 02:02:30 | <ghostbuster> | i know lots of imperative languages, from assembly to python to go\ |
| 02:03:07 | <ghostbuster> | is there any overlap between functional languages and abstract algebra? |
| 02:03:23 | × | mechap quits (~mechap@user/mechap) (Ping timeout: 248 seconds) |
| 02:03:25 | <dsal> | That question's pretty abstract. :) |
| 02:03:34 | <davean> | ghostbuster: absolutely but I'm not sure the overlap is helpful to you |
| 02:04:46 | <ghostbuster> | the usual way i'd learn a language is by reading a bit of an intro, common pitfalls for newbies, and then try to build a project in it |
| 02:05:13 | → | mechap joins (~mechap@user/mechap) |
| 02:06:57 | → | ddellacosta joins (~ddellacos@146.70.166.234) |
| 02:07:19 | → | freeside joins (~mengwong@103.252.202.170) |
| 02:07:33 | <aljer> | FP borrows a lot of concepts from category theory, if you are interested in the mathematical overlap. not necessary to be well versed in it, but it will help when you get to monads |
| 02:07:58 | <dsal> | ghostbuster: That works if you're expressing the same solution in different languages. Haskell lets you do a bit better, but you have to learn to think about problems a bit differently to do that. |
| 02:11:03 | <ghostbuster> | would it be good to by solving relatively "abstract" math problems like stuff from project euler? i think i read that fibonacci is a good "hello world" |
| 02:11:25 | <dsal> | Yeah. I get bored by euler fast because I'm not a mather. |
| 02:11:40 | <dsal> | exercism has some good stuff, but also AoC. |
| 02:11:57 | <dsal> | And probably countless other things. |
| 02:12:08 | <aljer> | AoC is great for learning Haskell! |
| 02:12:18 | <lechner> | ghostbuster / you definitely want to get used to recursion |
| 02:12:20 | <ghostbuster> | what does making a syscall look like in a purely functional language? |
| 02:12:31 | <dsal> | It looks like any other effect. |
| 02:12:45 | <ghostbuster> | i thought effects are not allowed :) |
| 02:12:46 | <jean-paul[m]> | readLine :: IO String |
| 02:12:52 | <dsal> | effects are isolated. |
| 02:13:56 | <lechner> | in monads |
| 02:14:35 | <lechner> | which is more or less to say that we enforce an ordering in time on them |
| 02:21:55 | <ghostbuster> | what is everyone's favourite beginner intro site / book? |
| 02:22:11 | <dsal> | I liked haskellbook, but that's not everyone's favorite. |
| 02:22:16 | <lechner> | LYAH |
| 02:22:26 | <aljer> | Learn You a Haskell ^ |
| 02:23:12 | <dsal> | Like, you ask here |
| 02:23:48 | → | Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915) |
| 02:23:53 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 268 seconds) |
| 02:24:13 | → | xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) |
| 02:24:26 | <lechner> | ghostbuster / one more thing. you will read a lot about monads, and people like to get complicated. they are basically just a sequential execution where the previous result is used as input for the next, and a conditional can abort in between. no need to get scared (and i am not afraid of any flames) |
| 02:25:04 | Lord_of_Life_ | is now known as Lord_of_Life |
| 02:25:15 | <ghostbuster> | lechner: thanks i may lose interest / get distracted but i won't get discouraged :) |
| 02:25:26 | <dsal> | Yeah, and also don't try really hard to learn monads. You can use them without having a deep understanding and trying to understand something without the fundamentals is just hard. |
| 02:25:53 | <ghostbuster> | cool |
| 02:26:00 | <dsal> | ghostbuster: Haskell has been my go-to language for years now. It's weird at first, but it's the easiest thing to work in, IMO. |
| 02:26:06 | <aljer> | 100% --> there's a kind of joke around how "hard to grasp" monads are |
| 02:26:23 | <aljer> | and if you try to understand them from the category theory perspective, maybe that's true at first |
| 02:26:45 | <aljer> | but from the practical, programming perspective not so much |
| 02:27:27 | <dsal> | Mostly, you just need to know types. Types tell the story. |
| 02:27:43 | <ghostbuster> | the reason i came here is i want to learn about compiler theory and code analysis, from a security standpoint |
| 02:28:04 | <dsal> | Writing parsers in haskell is so easy it's nearly boring. |
| 02:28:09 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 02:28:10 | <ghostbuster> | but if i learned some category theory that would be cool too |
| 02:28:20 | <dsal> | At least with parser combinators. The hardest part is trying to not build a new language for every project. |
| 02:28:21 | <lechner> | we call them domain-specific languages, or DSL |
| 02:28:23 | <dsal> | I don't do too well with that. |
| 02:29:12 | <ghostbuster> | would it be valuable to write a very basic program, compile it, and look at the generated assembly? |
| 02:29:22 | <lechner> | ghostbuster / for monads, it helps to think first about "continuation-passing style". i wish i could find that Javascript video (or was it Rust?) |
| 02:29:22 | <dsal> | There are multiple layers down to asm. |
| 02:29:38 | <dsal> | ghostbuster: https://play-haskell.tomsmeding.com is a tool that will do that stuff for you. |
| 02:30:39 | <dsal> | ghc compiles to "core" which is a smaller language. |
| 02:31:12 | <ghostbuster> | interesting |
| 02:31:56 | <dsal> | If you're trying to learn haskell by looking at asm, that's probably not going to be very… efficient. |
| 02:32:34 | <ghostbuster> | ok fair enough, that's just the C programmer in me talking |
| 02:32:55 | <dsal> | Learn how to use the language idiomatically first, then learn how/when to figure out how to make programs more efficient which might involve looking at core. By the time you're looking at some processor's assembler output, you're in a weird place. |
| 02:33:04 | <dsal> | Yeah, this is where C will hurt your ability to learn. |
| 02:33:17 | <yushyin> | most of haskell i learned by reading along here |
| 02:33:19 | <yushyin> | ♥ |
| 02:33:21 | <dsal> | The goal isn't necessarily to write the fastest program theoretically possible. It's about making a clear an correct expression of your problem. |
| 02:34:02 | <dsal> | Efficiency can be achieved at a much higher level. |
| 02:34:31 | <dsal> | But also, you've got stuff like STM. Technically possible in many languages, but very difficult to use correctly in pretty much anything but Haskell. |
| 02:35:09 | <ghostbuster> | STM appears to be some sort of concurrency primitive? |
| 02:36:08 | <davean> | Yes, it is, there are many others. |
| 02:37:42 | <davean> | ghostbuster: You can basicly map STM to a transaction system in an MVCC system over memory |
| 02:38:32 | <dsal> | We do have mutexes and semaphores and stuff. STM feels like magic, though. Imagine trying to compose two functions that use mutexes. |
| 02:39:08 | <ghostbuster> | yeah that sounds messy |
| 02:39:16 | <davean> | dsal: I'm weirded out by your claim looking at ASM for Haskell is a weird place though. I think it makes a ton of sense in library design specificly, particularly for datastructures. |
| 02:39:56 | <ghostbuster> | well, thanks everyone for living up to the reputation of being newbie-friendly |
| 02:40:03 | <dsal> | You *can*, but I've never seen anyone suggesting looking at the code generated by idiomatic haskell as a good way to learn the language. |
| 02:40:26 | <davean> | Not for learning the language no, but for programming in it |
| 02:41:39 | <ghostbuster> | i wouldn't suggest reading assembly to learn C, but I would say it's good to know what assembly your C produces |
| 02:41:45 | <dsal> | Are you suggesting it's common for haskell programmers to look at generated machine code? |
| 02:42:12 | davean | looks at everyone he codes with |
| 02:42:17 | <davean> | In some circles, absolutely normal |
| 02:42:21 | <dsal> | ghostbuster: I do that for microcontrollers, but I don't even know the instruction set of the machine I'm on. |
| 02:42:50 | <davean> | I was just over having a discussion about GHC's ASM actually that I was interleaving this with |
| 02:43:24 | <dsal> | "weird" implies not universally common. I don't mean to suggest that nobody doest it. But on your first day with the language, you're in a weird place if you're looking at that sort of thing. |
| 02:43:52 | <davean> | Not your first day though, but basicly all the haskell programmers I know do it at least occasionally, some of them quite often |
| 02:44:23 | <davean> | I think I've worked with exactly one Haskeller who hasn't done it somewhat regularly. |
| 02:44:42 | <dsal> | Neat. Still sounds like a pretty weird place. Doesn't come up that much at work. |
| 02:44:48 | <ghostbuster> | i have questions about this 'succ' function.. |
| 02:44:56 | <dsal> | @src succ |
| 02:44:56 | <lambdabot> | Source not found. Sorry about this, I know it's a bit silly. |
| 02:44:59 | <dsal> | lame |
| 02:44:59 | <davean> | ghostbuster: what about it? |
| 02:45:33 | <ghostbuster> | i'm not sure how to ask it.. i realized i don't know what a type *is* |
| 02:45:47 | <davean> | ghostbuster: well start speaking |
| 02:45:55 | <davean> | just state confusions |
| 02:45:59 | <ghostbuster> | how does the language know that 8 < 9 |
| 02:46:06 | <dsal> | Well, first it has to know what `8` is |
| 02:46:09 | <davean> | in *haskell* it doesn't |
| 02:46:23 | <ghostbuster> | i guess a type has to specify all valid values |
| 02:46:27 | <davean> | though there might be an "8" with a definition "8 < 9" |
| 02:46:35 | <davean> | ghostbuster: can you show some code? |
| 02:46:45 | <ghostbuster> | davean: it's on this page http://learnyouahaskell.com/starting-out |
| 02:46:54 | <ghostbuster> | ghci> succ 8 |
| 02:46:57 | <ghostbuster> | 9 |
| 02:47:03 | <davean> | so it does NOT know that 8 is < 9 |
| 02:47:05 | <davean> | in that case |
| 02:47:21 | <davean> | class Enum a where |
| 02:47:23 | <davean> | succ :: a -> a |
| 02:47:38 | <ghostbuster> | is it okay to paste 2 lines into chan btw |
| 02:48:09 | <davean> | What we know is that "succ" is a definition, which knows how to produce a value that has the "Enum" characturistic, with some relation to a given value of the same "a" type |
| 02:48:09 | <ghostbuster> | ghci> 8 < 9 |
| 02:48:12 | <ghostbuster> | True |
| 02:48:14 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 02:48:35 | <davean> | Now, the laws are how we end up with an 8 < (succ 8) relationship |
| 02:48:37 | <dsal> | ghostbuster: That's slightly confusing defaulting behavior in ghci. It's picking a type for 8. `:t 8` might help. |
| 02:48:58 | <davean> | https://hackage.haskell.org/package/base-4.17.0.0/docs/GHC-Enum.html#t:Enum |
| 02:49:35 | <dsal> | I don't see anything about laws here… Is there a law that `x < succ x` ? |
| 02:49:39 | <davean> | And yah, we actually lack technical confidence in "8 < (succ 8)" |
| 02:49:47 | <davean> | in fact, its sorta not generally true |
| 02:49:53 | <Clinton[m]> | Is there a function somewhere like:... (full message at <https://libera.ems.host/_matrix/media/v3/download/libera.chat/bde3899c12cd7a587e46720905d45dd7ea7620f3>) |
| 02:50:08 | → | tessier joins (~treed@ec2-184-72-149-67.compute-1.amazonaws.com) |
| 02:50:09 | <davean> | We HAPPEN to be on Int here, ebcause you' |
| 02:50:12 | <davean> | re in ghci |
| 02:50:21 | <dsal> | > succ (128::Int8) |
| 02:50:23 | <lambdabot> | -127 |
| 02:50:39 | <davean> | dsal: ok, for that one its violating the Enum laws :( |
| 02:51:01 | <aljer> | it works for Enum because Enum can be incremented, right? |
| 02:51:05 | <ghostbuster> | are all types ordered? |
| 02:51:09 | <davean> | ghostbuster: no |
| 02:51:20 | <davean> | ghostbuster: Some are partial ordered, some are unordered |
| 02:51:30 | <davean> | ghostbuster: only types with the "Ord" property are ordered |
| 02:51:56 | <davean> | and the Enum, Num, and Ord properties have relationships between them |
| 02:52:14 | <lechner> | it helps to like math |
| 02:52:32 | <ghostbuster> | i do like math |
| 02:52:35 | × | waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 246 seconds) |
| 02:52:49 | <davean> | ghostbuster: https://hackage.haskell.org/package/base-4.17.0.0/docs/Data-Ord.html#t:Ord here is our definition of the Ord property |
| 02:52:55 | <ghostbuster> | arguing is fun haha |
| 02:53:04 | <dsal> | ghostbuster: ghci defaulting behavior is a bit weird. In practice, `8` just means something with a `Num` instance. You can make up your own. |
| 02:53:18 | <davean> | ghostbuster: you'll see it has a list of types with said property (though it only lists those in 'base') |
| 02:53:41 | <ghostbuster> | so types can have properties? |
| 02:53:45 | <davean> | yah, for example "Down Int" would not be "8 < (succ 8)" |
| 02:54:14 | <ghostbuster> | sorry what is Down? |
| 02:54:15 | <davean> | Down is a type that takes another type and *reverses its notion of ordering* |
| 02:54:30 | <dsal> | ghostbuster: A class is not a type. Classes constraint types. But types, in general, have value constructors. |
| 02:54:35 | <davean> | so, Down Int is like Int, except with a reversed idea or order |
| 02:55:00 | <dsal> | There are a couple of convenience ones like numeric literals and string literals that have some language support making it easy to enter values into your program for types you're using. |
| 02:55:08 | <davean> | dsal: your specific Int8 example violates "The calls succ maxBound and pred minBound should result in a runtime error." |
| 02:55:29 | <dsal> | davean: Ohh... Yes. I was slightly confused as to what law you were referring to. That does make sense. |
| 02:55:48 | <dsal> | > succ maxBound :: Int8 |
| 02:55:50 | <lambdabot> | *Exception: Enum.succ{Int8}: tried to take `succ' of maxBound |
| 02:55:54 | <lechner> | are you two brothers? |
| 02:55:56 | <dsal> | well that's annoying. |
| 02:56:10 | → | gmg joins (~user@user/gehmehgeh) |
| 02:56:33 | <aljer> | lechner: plot twist - they are the same person |
| 02:56:42 | <davean> | dsal: you got confused because Int8 is asymetric ranged |
| 02:56:51 | <dsal> | Oh. That's even weirder. |
| 02:56:55 | <lechner> | aljer / i knew it! |
| 02:57:10 | <davean> | dsal: No! This is the nature of two's compliment arithmetic! |
| 02:57:26 | <davean> | You get 1 more range in the negative space than the possitive |
| 02:57:35 | <davean> | so the range is -128 to 127 |
| 02:57:47 | × | opticblast quits (~Thunderbi@172.58.82.191) (Ping timeout: 248 seconds) |
| 02:57:51 | <dsal> | Right. I put the extra on the wrong side. |
| 02:57:54 | <davean> | since the encoding puts the zero into the possitive range |
| 02:58:17 | <davean> | ghostbuster: now that we've confused you ... |
| 02:58:28 | <dsal> | > 128::Int8 -- is the bad behavior |
| 02:58:29 | <lambdabot> | -128 |
| 02:59:08 | × | gehmehgeh quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 02:59:23 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 248 seconds) |
| 03:00:24 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:f849:6b89:c0b7:d8b5) |
| 03:03:16 | <ghostbuster> | sorry was afk lol |
| 03:03:56 | <davean> | ghostbuster: It was a bit of a digression |
| 03:04:08 | <davean> | ghostbuster: so you mentioned abstract algebra before |
| 03:04:16 | <davean> | ghostbuster: is it something you are actually familiar with? |
| 03:04:18 | <int-e> | @check \(x :: Int8) -> abs x >= 0 |
| 03:04:18 | <lambdabot> | <unknown>.hs:1:14:ScopedTypeVariables language extension is not enabled. Ple... |
| 03:04:32 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 03:04:34 | <int-e> | @check \x -> (abs x :: Int8) >= 0 |
| 03:04:36 | <lambdabot> | *** Failed! Falsifiable (after 52 tests): |
| 03:04:36 | <lambdabot> | -128 |
| 03:04:44 | <dsal> | One of my favorite bugs. |
| 03:05:48 | × | dtman34 quits (~dtman34@76.156.89.180) (Quit: ZNC 1.8.2+deb2+b1 - https://znc.in) |
| 03:05:55 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 03:05:56 | <ghostbuster> | davean: not really, a few years ago i had a class on calculus with a taste of algebra and i've thought it would be fun to learn it properly |
| 03:06:09 | <int-e> | it's a surprise; I don't think of it as a bug. |
| 03:06:10 | <davean> | ah, ok |
| 03:06:38 | → | dtman34 joins (~dtman34@2601:447:d000:93c9:4f13:e7d1:81fd:2aa6) |
| 03:06:38 | <davean> | ghostbuster: well, uh, so this doesn't actually map to normal things in Haskell, but perhaps you've seen like "Integer" vs. "Natural" numbers? |
| 03:06:46 | <dsal> | int-e: it's specified, but I'm surely not the only person who's written a production bug due to `abs x` returning a negative number unexpectedly. |
| 03:06:53 | <ghostbuster> | yeah i'm familiar with the meaning of that distinction in math |
| 03:07:09 | <ghostbuster> | i think anyway.. integer includes zero? |
| 03:07:22 | <davean> | ghostbuster: right, so each is pretty relatable to a type, and they both have "Addable" but only one has "Negatable" |
| 03:07:45 | <ghostbuster> | makes sense |
| 03:07:45 | <davean> | ghostbuster: Integer has the negatives |
| 03:07:48 | <ghostbuster> | ah ok |
| 03:08:04 | <davean> | Natural containing zero or not is actually a point of confusion |
| 03:08:04 | <ghostbuster> | i am not a mathematician heh |
| 03:08:32 | <davean> | I thought the "has the idea of negation" or not would be a sensible enough mapping for you to start thinking abouit it either way |
| 03:08:55 | <ghostbuster> | yeah the idea of sets that support certain operations |
| 03:08:56 | <int-e> | Yeah mathematicians themselves can't agree on whether 0 is a natural number, it's hilarious. |
| 03:09:04 | <davean> | so the "type" represents the set of *actual values* and the type classes represent the things we can do with them and the behaviors they have when we do said with them |
| 03:09:28 | <davean> | Not QUITE this clean in Haskell but pretty close |
| 03:09:52 | <davean> | so " |
| 03:10:05 | <davean> | "data Natural = Zero | One | Two | ..." |
| 03:10:51 | <davean> | and "data Integer = Possitive Natural | Negative Natural" say (yah that encoding has two versions of Zero, sue me) |
| 03:11:24 | <davean> | I can easily impliment addition for both (Mind you this is NOT how you'd actually encode the types) |
| 03:11:34 | <davean> | (my point is that every type has a specific set of values inside it) |
| 03:11:59 | <ghostbuster> | btw "the asymmetric range of two's complement arithmetic" is exactly the kind of edge case that security researchers like |
| 03:12:20 | × | aljer quits (~jonathon@2601:5c1:4503:8da0:7130:73a8:a627:b376) (Quit: WeeChat 3.8) |
| 03:12:24 | <davean> | ghostbuster: we could have a SaturatingInt8! |
| 03:12:36 | → | aljer joins (~jonathon@2601:5c1:4503:8da0:7130:73a8:a627:b376) |
| 03:12:37 | <davean> | it would have the same set of values as Int8 but different *behavior* |
| 03:12:49 | <davean> | specificly, it would hit 127 and stop, instead of roll over. |
| 03:12:49 | <ghostbuster> | that was going to be my next questio.. can we mix/match types and type classes |
| 03:12:55 | × | aljer quits (~jonathon@2601:5c1:4503:8da0:7130:73a8:a627:b376) (Client Quit) |
| 03:13:09 | <davean> | well a type has a NUMBER of type classes it impliments |
| 03:13:23 | <davean> | so we can talk about "anything that impliments" |
| 03:13:33 | <davean> | like say we have "Negate" and "Order" |
| 03:13:34 | <ghostbuster> | almost sounds like an interface in some imperative languages |
| 03:13:37 | <davean> | with the right rules, we can say |
| 03:13:44 | <davean> | it is related to interfaces |
| 03:14:02 | <davean> | interfaces are a specific subset of this |
| 03:14:27 | <davean> | so lets say we have Negate and Order, and we want to impliment abs |
| 03:14:46 | <davean> | abs :: forall a. (Negate a, Ord a) => a -> a |
| 03:15:19 | <davean> | so *if* we can order values in a, and *if* we can negate them, we can give you the absolute value, for any type a that supports both of those things |
| 03:15:37 | <int-e> | > negate (-128 :: Int8) |
| 03:15:38 | <davean> | abs a = if a < 0 then negate a else a |
| 03:15:39 | <lambdabot> | -128 |
| 03:16:00 | <davean> | again, you'd need to the right laws on Ord and Negate to prove that was *actually* abs |
| 03:16:20 | ghostbuster | is processing |
| 03:16:20 | <int-e> | You won't escape this one unless you make that negation error (it's an overflow). |
| 03:16:24 | <davean> | now I should probably explain some ways type classes are more than interfaces |
| 03:16:46 | <davean> | int-e: I'm trying to talk about the ideas - I'm acknowleging its not quite right code |
| 03:16:54 | <ghostbuster> | this is fascinating, even if I don't learn haskell i'm going to hang out in this channel more often |
| 03:17:08 | <int-e> | evil version: abs a = if a < 0 then abs (negate a) else a |
| 03:17:28 | <ghostbuster> | i'm not familiar enough with the syntax yet - is your definition of abs not quite right there? |
| 03:17:35 | <int-e> | (non-termination is the least helpful bottom) |
| 03:17:38 | <davean> | ghostbuster: so you're ok with the idea of parameter and return possitions in a fucnction definition? |
| 03:17:48 | <int-e> | ghostbuster: no, I modified it slightly |
| 03:17:57 | <davean> | ghostbuster: Its not quite right in that we don't have the laws and know which direction ordering is in |
| 03:18:00 | <int-e> | davean's version that is. |
| 03:18:09 | <ghostbuster> | not familiar with return position |
| 03:18:17 | <davean> | ghostbuster: for example it fails with "Down Int" |
| 03:18:27 | <davean> | "int f(char)" |
| 03:18:34 | <davean> | we're calling with char and returning int |
| 03:18:45 | <ghostbuster> | yeah i'm fine with that |
| 03:19:01 | <ghostbuster> | i guess golang allows multiple return values |
| 03:19:01 | <davean> | ok, so interfaces in most languages can only be choosen by the paramters, not what you return |
| 03:19:27 | <davean> | for example "fromIntegral :: (Integral a, Num b) => a -> b " |
| 03:19:37 | <davean> | given anythng that is an Integral, I can produce anything that is a Num that you want |
| 03:19:54 | <davean> | we decide what function that is on BOTH types |
| 03:20:39 | <davean> | MOST language can't do that sort of thing with an interface (at least not directly) |
| 03:20:57 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 03:21:20 | <davean> | (The directly part is actually important, which I'm not sure you're ready to get into ATM) |
| 03:21:44 | <ghostbuster> | sorry afk again (keep going though, i'll need to read it a few times anyway) |
| 03:22:16 | <ghostbuster> | is the syntax there funName :: (inputType inputName, outputType outputName) => ... |
| 03:22:22 | <ghostbuster> | why do we specify a -> b? |
| 03:22:24 | <davean> | well we're somewhat to the limits of what I think you might be ready to absorb ATM, I just didn't want to leave asside completely that there is a touch more going on than interfaces give you |
| 03:22:29 | × | gabiruh quits (~gabiruh@vps19177.publiccloud.com.br) (Quit: ZNC 1.7.5 - https://znc.in) |
| 03:22:31 | <dsal> | :t succ . minBound |
| 03:22:32 | <lambdabot> | (Enum c, Bounded (a -> c)) => a -> c |
| 03:22:52 | <ghostbuster> | davean: i think i am near my limit :) |
| 03:22:52 | <dsal> | Oops. Walking my dog. Heh |
| 03:23:04 | <dsal> | :t succ minBound |
| 03:23:05 | <lambdabot> | (Enum a, Bounded a) => a |
| 03:23:09 | <davean> | ghostbuster: to read it off as english "The function "fromIntegral" can take any type 'a' with Integral defined for it, and give you any type 'b' with Number defined for it" |
| 03:23:18 | <ghostbuster> | ahh |
| 03:23:22 | <ghostbuster> | gotcha |
| 03:23:42 | <davean> | ghostbuster: to be clear, these next two things *are the same* |
| 03:23:49 | <davean> | "fromIntegral :: (Integral a, Num b) => a -> b" |
| 03:23:58 | <davean> | "fromIntegral :: (Num b, Integral a) => a -> b " |
| 03:24:14 | <ghostbuster> | hmm ok because they seem to invert each other |
| 03:24:20 | <lechner> | too much for one day, i think |
| 03:24:22 | <ghostbuster> | btw should i keep going with LYAH and/or are there any other sites you recommend |
| 03:24:50 | <davean> | Honestly they're all fine. LYAH isn't good or bad, your first one will probably surprise you enough you won't realize you're being surprised |
| 03:25:11 | <davean> | it'll probably be the second one you work through that you'll "Get it" on |
| 03:25:41 | → | gabiruh joins (~gabiruh@vps19177.publiccloud.com.br) |
| 03:25:57 | <davean> | there is going to be a level of expsure required to internalize it all |
| 03:26:52 | <davean> | two pieces of advice A) don't assume the book is completely right, and B) don't assume your understanding of it is completely right |
| 03:26:58 | <davean> | probably in the reverse order |
| 03:27:43 | <davean> | Most of the "approachable" Haskell books round off some of the rough corners and give you a slightly simplified version of it, and second you're almost definately going to miss read something the first time through |
| 03:29:57 | <ghostbuster> | cool |
| 03:31:38 | tjnhxmzhmqgytuwt | is now known as Guest809 |
| 03:31:44 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 248 seconds) |
| 03:31:49 | × | king_gs quits (~Thunderbi@2806:103e:29:1779:904b:7f43:decf:5c51) (Ping timeout: 252 seconds) |
| 03:34:45 | → | finn_elija joins (~finn_elij@user/finn-elija/x-0085643) |
| 03:34:45 | × | FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija))) |
| 03:34:45 | finn_elija | is now known as FinnElija |
| 03:41:11 | × | terrorjack quits (~terrorjac@2a01:4f8:1c1e:4e8c::) (Quit: The Lounge - https://thelounge.chat) |
| 03:42:13 | → | terrorjack joins (~terrorjac@2a01:4f8:1c1e:4e8c::) |
| 03:42:49 | → | king_gs joins (~Thunderbi@187.201.41.239) |
| 03:48:58 | × | johnw quits (~johnw@2600:1700:cf00:db0:6c1f:968f:ea89:5c51) (Quit: ZNC - http://znc.in) |
| 03:50:03 | × | czy` quits (~user@host-140-28.ilcub310.champaign.il.us.clients.pavlovmedia.net) (Remote host closed the connection) |
| 03:50:03 | × | czy quits (~user@host-140-28.ilcub310.champaign.il.us.clients.pavlovmedia.net) (Remote host closed the connection) |
| 03:52:09 | × | jero98772 quits (~jero98772@2800:484:1d80:d8ce:9815:cfda:3661:17bb) (Remote host closed the connection) |
| 03:56:25 | <EvanR> | ghostbuster, Integral and Num aren't types but type classes |
| 03:56:47 | <EvanR> | confusing at first since Char and Int are types and have caps |
| 04:00:23 | <davean> | I thought I disabused them of that notion, but maybe not directly enough |
| 04:01:28 | <EvanR> | turning the disabuse up to 11 |
| 04:01:54 | × | td_ quits (~td@i5387092C.versanet.de) (Ping timeout: 260 seconds) |
| 04:03:38 | → | td_ joins (~td@i53870902.versanet.de) |
| 04:03:53 | × | FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection) |
| 04:04:40 | × | Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep) |
| 04:04:52 | → | ddellaco1 joins (~ddellacos@146.70.165.234) |
| 04:06:07 | → | FinnElija joins (~finn_elij@user/finn-elija/x-0085643) |
| 04:06:20 | × | ddellacosta quits (~ddellacos@146.70.166.234) (Ping timeout: 260 seconds) |
| 04:07:57 | → | falafel joins (~falafel@2607:fb91:143f:e47f:40a:c679:74d:6469) |
| 04:09:17 | × | Flow quits (~none@gentoo/developer/flow) (Ping timeout: 246 seconds) |
| 04:10:33 | × | wroathe quits (~wroathe@user/wroathe) (Quit: leaving) |
| 04:12:51 | × | kee quits (~~kee@user/wizzwizz4) (Ping timeout: 252 seconds) |
| 04:12:51 | × | king_gs quits (~Thunderbi@187.201.41.239) (Read error: Connection reset by peer) |
| 04:13:19 | → | king_gs joins (~Thunderbi@2806:103e:29:1779:9d49:6db4:ea03:1907) |
| 04:17:58 | <jle`> | hi :) can I specify somewhere on the local filesystem with source-repository-package in cabal.project? |
| 04:18:15 | <jle`> | if i put in a relative filepath then it says repository <local> doesn't exist |
| 04:19:18 | <jle`> | hm just found the docs, it looks like no |
| 04:23:09 | → | Flow joins (~none@gentoo/developer/flow) |
| 04:25:09 | <jackdk> | jle`: have you tried `packages: . ../../path/to/your/other/package`? |
| 04:25:29 | <jackdk> | that might work, I do not remember. Note that `.` is still there for the package you're hacking on. |
| 04:26:16 | × | king_gs quits (~Thunderbi@2806:103e:29:1779:9d49:6db4:ea03:1907) (Ping timeout: 252 seconds) |
| 04:37:47 | × | slack1256 quits (~slack1256@186.11.100.232) (Ping timeout: 252 seconds) |
| 04:40:57 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 04:41:30 | × | kayvank quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Client Quit) |
| 04:43:11 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 248 seconds) |
| 04:44:48 | → | troydm joins (~troydm@user/troydm) |
| 04:52:38 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 04:52:39 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 04:53:03 | ← | kayvank parts (~user@52-119-115-185.PUBLIC.monkeybrains.net) () |
| 04:56:09 | × | Vajb quits (~Vajb@2001:999:404:9516:d621:6cbe:c71e:5686) (Read error: Connection reset by peer) |
| 04:56:22 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) |
| 05:04:52 | → | andrewboltachev joins (~andrey@178.141.147.162) |
| 05:05:50 | × | echoreply quits (~echoreply@2001:19f0:9002:1f3b:5400:ff:fe6f:8b8d) (Ping timeout: 260 seconds) |
| 05:09:02 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 05:09:34 | → | Vajb joins (~Vajb@2001:999:404:9516:d621:6cbe:c71e:5686) |
| 05:10:56 | × | motherfsck quits (~motherfsc@user/motherfsck) (Ping timeout: 248 seconds) |
| 05:15:23 | × | ddellaco1 quits (~ddellacos@146.70.165.234) (Ping timeout: 248 seconds) |
| 05:18:49 | → | echoreply joins (~echoreply@2001:19f0:9002:1f3b:5400:ff:fe6f:8b8d) |
| 05:30:35 | → | king_gs joins (~Thunderbi@187.201.41.239) |
| 05:33:11 | × | lbseale quits (~quassel@user/ep1ctetus) (Ping timeout: 264 seconds) |
| 05:34:37 | × | thegeekinside quits (~thegeekin@189.180.83.186) (Ping timeout: 252 seconds) |
| 05:46:43 | × | [Leary] quits (~Leary]@user/Leary/x-0910699) (Remote host closed the connection) |
| 05:48:09 | → | [Leary] joins (~Leary]@user/Leary/x-0910699) |
| 05:48:30 | → | michalz joins (~michalz@185.246.204.125) |
| 05:50:51 | → | king_gs1 joins (~Thunderbi@2806:103e:29:1779:d49d:8027:303:6836) |
| 05:51:29 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 05:51:39 | × | king_gs quits (~Thunderbi@187.201.41.239) (Ping timeout: 248 seconds) |
| 05:51:39 | king_gs1 | is now known as king_gs |
| 05:51:55 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 260 seconds) |
| 05:52:35 | <jle`> | ooh |
| 05:53:42 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 05:53:42 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 05:53:42 | × | gmg quits (~user@user/gehmehgeh) (Remote host closed the connection) |
| 05:54:07 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 05:54:11 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 05:54:25 | <jle`> | that works, i think! thanks! :D |
| 05:55:00 | → | gmg joins (~user@user/gehmehgeh) |
| 05:55:09 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 05:58:58 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 05:59:08 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 05:59:09 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 06:01:47 | → | johnw joins (~johnw@2600:1700:cf00:db0:49b4:fe12:640e:f573) |
| 06:02:01 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 06:13:43 | → | motherfsck joins (~motherfsc@user/motherfsck) |
| 06:14:26 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 06:15:41 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 06:22:47 | × | king_gs quits (~Thunderbi@2806:103e:29:1779:d49d:8027:303:6836) (Quit: king_gs) |
| 06:23:02 | → | king_gs joins (~Thunderbi@187.201.41.239) |
| 06:32:53 | → | takuan joins (~takuan@178-116-218-225.access.telenet.be) |
| 06:36:42 | × | jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 268 seconds) |
| 06:38:12 | → | opticblast joins (~Thunderbi@172.58.80.43) |
| 06:38:56 | × | falafel quits (~falafel@2607:fb91:143f:e47f:40a:c679:74d:6469) (Ping timeout: 248 seconds) |
| 06:44:47 | × | opticblast quits (~Thunderbi@172.58.80.43) (Ping timeout: 248 seconds) |
| 06:49:16 | → | akegalj joins (~akegalj@93-138-121-55.adsl.net.t-com.hr) |
| 06:53:14 | → | king_gs1 joins (~Thunderbi@2806:103e:29:1779:2e75:83f4:fb45:6a17) |
| 06:53:14 | × | king_gs quits (~Thunderbi@187.201.41.239) (Read error: Connection reset by peer) |
| 06:53:14 | king_gs1 | is now known as king_gs |
| 06:57:04 | × | motherfsck quits (~motherfsc@user/motherfsck) (Ping timeout: 248 seconds) |
| 06:59:44 | × | king_gs quits (~Thunderbi@2806:103e:29:1779:2e75:83f4:fb45:6a17) (Ping timeout: 248 seconds) |
| 07:02:09 | → | kenran joins (~user@user/kenran) |
| 07:17:49 | × | harveypwca quits (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) (Quit: Leaving) |
| 07:18:01 | × | werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 268 seconds) |
| 07:18:21 | → | irrgit__ joins (~irrgit@146.70.27.242) |
| 07:18:37 | → | freeside joins (~mengwong@122.11.214.168) |
| 07:19:30 | → | werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) |
| 07:21:19 | × | irrgit_ quits (~irrgit@146.70.27.242) (Ping timeout: 252 seconds) |
| 07:23:45 | → | trev joins (~trev@user/trev) |
| 07:29:40 | → | ksqsf joins (~user@2001:da8:d800:600:55ca:77b6:4886:7934) |
| 07:30:04 | → | ksqsf` joins (~user@2001:da8:d800:600:55ca:77b6:4886:7934) |
| 07:36:29 | × | kenran quits (~user@user/kenran) (Remote host closed the connection) |
| 07:38:34 | → | razetime joins (~Thunderbi@117.193.0.210) |
| 07:39:27 | → | motherfsck joins (~motherfsc@user/motherfsck) |
| 07:41:32 | → | coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) |
| 07:43:22 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 07:45:06 | → | charukiewicz joins (~charukiew@c-71-239-23-125.hsd1.il.comcast.net) |
| 07:48:05 | × | jpds quits (~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection) |
| 07:48:07 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 07:48:48 | → | jpds joins (~jpds@gateway/tor-sasl/jpds) |
| 07:49:52 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 07:49:59 | × | FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection) |
| 07:50:51 | → | FinnElija joins (~finn_elij@user/finn-elija/x-0085643) |
| 07:52:06 | × | whatsupdoc quits (uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
| 07:55:07 | → | lisbeths joins (uid135845@id-135845.lymington.irccloud.com) |
| 07:57:55 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:a8f5:3359:54ee:1396) |
| 07:58:51 | × | freeside quits (~mengwong@122.11.214.168) (Read error: Connection reset by peer) |
| 08:01:35 | → | chele joins (~chele@user/chele) |
| 08:02:45 | × | razetime quits (~Thunderbi@117.193.0.210) (Ping timeout: 252 seconds) |
| 08:03:36 | → | turlando joins (~turlando@user/turlando) |
| 08:10:38 | × | albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection) |
| 08:12:44 | → | zeenk joins (~zeenk@2a02:2f04:a214:1e00::7fe) |
| 08:16:45 | → | albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8) |
| 08:20:54 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 08:21:23 | × | charukiewicz quits (~charukiew@c-71-239-23-125.hsd1.il.comcast.net) (Quit: Client closed) |
| 08:21:33 | → | amano joins (~amano@45.8.223.209) |
| 08:21:41 | → | razetime joins (~Thunderbi@117.193.0.210) |
| 08:22:29 | → | freeside joins (~mengwong@129.126.62.10) |
| 08:22:35 | <amano> | After researching which license to use for a haskell library, I chose 0BSD which is essentialy public domain. |
| 08:24:18 | × | amano quits (~amano@45.8.223.209) (Client Quit) |
| 08:25:38 | → | jonathanx joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) |
| 08:33:45 | → | _leo___ joins (~emmanuelu@user/emmanuelux) |
| 08:34:05 | → | merijn joins (~merijn@c-001-001-010.client.esciencecenter.eduvpn.nl) |
| 08:34:39 | × | xacktm quits (~xacktm@user/xacktm) (Ping timeout: 260 seconds) |
| 08:34:56 | × | lieven quits (~mal@ns2.wyrd.be) (Ping timeout: 246 seconds) |
| 08:35:05 | × | nullsh quits (nullsh@user/nullsh) (Ping timeout: 252 seconds) |
| 08:36:52 | → | nullsh joins (nullsh@user/nexeq) |
| 08:36:59 | × | emmanuelux quits (~emmanuelu@user/emmanuelux) (Ping timeout: 248 seconds) |
| 08:37:00 | → | lieven joins (~mal@ns2.wyrd.be) |
| 08:38:14 | × | use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) (Remote host closed the connection) |
| 08:38:33 | → | use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) |
| 08:39:49 | → | nschoe joins (~q@141.101.51.197) |
| 08:40:07 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:f849:6b89:c0b7:d8b5) (Remote host closed the connection) |
| 08:40:25 | → | cheater_ joins (~Username@user/cheater) |
| 08:41:03 | → | xacktm joins (~xacktm@user/xacktm) |
| 08:42:40 | × | cheater quits (~Username@user/cheater) (Ping timeout: 248 seconds) |
| 08:42:49 | cheater_ | is now known as cheater |
| 08:49:33 | → | cfricke joins (~cfricke@user/cfricke) |
| 08:50:08 | → | gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) |
| 08:50:52 | → | fserucas joins (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) |
| 08:50:52 | × | fserucas quits (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Client Quit) |
| 08:51:47 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 08:53:16 | × | Alex_test quits (~al_test@178.34.160.79) (Quit: ;-) |
| 08:54:11 | × | AlexZenon quits (~alzenon@178.34.160.79) (Quit: ;-) |
| 08:54:24 | × | AlexNoo quits (~AlexNoo@178.34.160.79) (Quit: Leaving) |
| 08:55:35 | × | tzh quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz) |
| 08:56:11 | × | motherfsck quits (~motherfsc@user/motherfsck) (Ping timeout: 248 seconds) |
| 08:56:31 | × | ft quits (~ft@p508dbcc4.dip0.t-ipconnect.de) (Quit: leaving) |
| 08:57:10 | → | MajorBiscuit joins (~MajorBisc@145.94.153.3) |
| 08:59:29 | → | avicenzi joins (~avicenzi@2a00:ca8:a1f:b004::c32) |
| 09:00:21 | × | vaibhavsagar[m] quits (~vaibhavsa@2001:470:69fc:105::ffe) (Quit: You have been kicked for being idle) |
| 09:00:24 | × | Magnus[m] quits (~magthetch@2001:470:69fc:105::d1a7) (Quit: You have been kicked for being idle) |
| 09:02:35 | × | freeside quits (~mengwong@129.126.62.10) (Ping timeout: 248 seconds) |
| 09:09:22 | → | CiaoSen joins (~Jura@p200300c957184d002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 09:11:11 | <stefan-_> | I stumbled upon an issue with automatic deriving of a Monad instance for a transformer stack: https://github.com/wkoszek/book-real-world-haskell/issues/2 |
| 09:11:21 | × | Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Quit: Leaving) |
| 09:11:31 | <stefan-_> | why is it that in previous GHC versions this did compile and in the current version not? |
| 09:12:21 | sshine_ | is now known as sshine |
| 09:14:24 | → | bgs joins (~bgs@212-85-160-171.dynamic.telemach.net) |
| 09:15:53 | <[Leary]> | stefan-_: http://wiki.haskell.org/Functor-Applicative-Monad_Proposal |
| 09:21:57 | <stefan-_> | [Leary], thanks |
| 09:24:43 | → | AlexNoo joins (~AlexNoo@178.34.160.79) |
| 09:25:16 | → | Alex_test joins (~al_test@178.34.160.79) |
| 09:28:16 | → | AlexZenon joins (~alzenon@178.34.160.79) |
| 09:38:40 | → | irrgit_ joins (~irrgit@89.47.234.74) |
| 09:40:37 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:f849:6b89:c0b7:d8b5) |
| 09:41:47 | × | irrgit__ quits (~irrgit@146.70.27.242) (Ping timeout: 255 seconds) |
| 09:44:56 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:f849:6b89:c0b7:d8b5) (Ping timeout: 246 seconds) |
| 09:49:31 | × | bhall quits (~brunohall@195.147.207.136) (Ping timeout: 248 seconds) |
| 09:50:47 | × | rburkholder quits (~blurb@96.45.2.121) (Remote host closed the connection) |
| 09:55:29 | → | freeside joins (~mengwong@103.252.202.170) |
| 09:56:10 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 09:58:40 | × | jludwig quits (~justin@li657-110.members.linode.com) (Read error: Connection reset by peer) |
| 09:59:36 | → | ubert joins (~Thunderbi@2a02:8109:abc0:6434:f835:7cff:6e4a:8bfb) |
| 10:01:12 | → | jludwig joins (~justin@li657-110.members.linode.com) |
| 10:01:26 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 268 seconds) |
| 10:02:10 | × | theproffesor quits (~theproffe@user/theproffesor) (Ping timeout: 260 seconds) |
| 10:05:25 | × | CiaoSen quits (~Jura@p200300c957184d002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Quit: CiaoSen) |
| 10:07:39 | × | johnw quits (~johnw@2600:1700:cf00:db0:49b4:fe12:640e:f573) (Ping timeout: 248 seconds) |
| 10:08:11 | × | xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 248 seconds) |
| 10:10:13 | → | gtdg joins (~gtdg@nat-inria-interne-72-gw-01-lne.lille.inria.fr) |
| 10:10:28 | → | stiell joins (~stiell@gateway/tor-sasl/stiell) |
| 10:10:35 | → | freeside joins (~mengwong@103.252.202.170) |
| 10:10:53 | × | jludwig quits (~justin@li657-110.members.linode.com) (Quit: ZNC - https://znc.in) |
| 10:11:12 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 248 seconds) |
| 10:11:16 | × | gtdg quits (~gtdg@nat-inria-interne-72-gw-01-lne.lille.inria.fr) (Changing host) |
| 10:11:16 | → | gtdg joins (~gtdg@user/gtdg) |
| 10:11:55 | → | jludwig joins (~justin@li657-110.members.linode.com) |
| 10:11:56 | → | kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be) |
| 10:13:21 | → | beteigeuze joins (~Thunderbi@bl14-81-220.dsl.telepac.pt) |
| 10:13:23 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 255 seconds) |
| 10:15:07 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds) |
| 10:15:16 | × | jludwig quits (~justin@li657-110.members.linode.com) (Client Quit) |
| 10:18:19 | × | ksqsf quits (~user@2001:da8:d800:600:55ca:77b6:4886:7934) (Ping timeout: 248 seconds) |
| 10:18:30 | × | ksqsf` quits (~user@2001:da8:d800:600:55ca:77b6:4886:7934) (Ping timeout: 260 seconds) |
| 10:18:58 | × | kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Quit: ERC (IRC client for Emacs 27.1)) |
| 10:19:12 | → | kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be) |
| 10:21:22 | × | phma quits (phma@2001:5b0:212a:e3d8:88c0:402f:ec64:11e8) (Read error: Connection reset by peer) |
| 10:22:22 | → | johnw joins (~johnw@2600:1700:cf00:db0:49b4:fe12:640e:f573) |
| 10:22:41 | → | CiaoSen joins (~Jura@p200300c957184d002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 10:22:53 | → | jwiegley joins (~jwiegley@2600:1700:cf00:db0:49b4:fe12:640e:f573) |
| 10:23:28 | → | mc47 joins (~mc47@xmonad/TheMC47) |
| 10:23:29 | × | gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.8) |
| 10:23:48 | → | themc47 joins (~mc47@xmonad/TheMC47) |
| 10:23:59 | × | themc47 quits (~mc47@xmonad/TheMC47) (Client Quit) |
| 10:24:55 | → | phma joins (~phma@host-67-44-208-154.hnremote.net) |
| 10:28:34 | × | troydm quits (~troydm@user/troydm) (Ping timeout: 268 seconds) |
| 10:32:01 | <turlando> | Would you suggest checking algebraic effect systems in Haskell or is it another layer of indirection that will eventually backfire at the worst moment? |
| 10:32:17 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 10:34:23 | → | gmg joins (~user@user/gehmehgeh) |
| 10:36:46 | × | econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity) |
| 10:38:33 | <merijn> | turlando: tbh, I'm not so convinced by them |
| 10:38:56 | <merijn> | But, as in all things "It Depends (TM)" |
| 10:38:58 | → | gehmehgeh joins (~user@user/gehmehgeh) |
| 10:39:34 | <turlando> | I was not expecting a binary answer indeed :) |
| 10:39:50 | <merijn> | turlando: Personally I'm a big believer in the fact that "just" IO heavy imperative Haskell will get you quite far |
| 10:39:55 | → | enoq joins (~enoq@2a05:1141:1f5:5600:b9c9:721a:599:bfe7) |
| 10:39:56 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 10:40:37 | <merijn> | So unless there's specific things/ideas/designs that require algebraic effects, I wouldn't invest too heavily until it's needed |
| 10:41:44 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:7c30:9144:ce25:cdcc) |
| 10:42:02 | <turlando> | From what I see the primary advantages are: 1. no complex stacks of nested monads; 2. dynamic dispatch of effects when needed (+ decoupling). Not sure if there's more |
| 10:44:00 | <merijn> | tbh, I think (visible) monad stacks are also an anti-pattern. Aggressively newtyping to hide those is the most robust way to go in my experience. And while I dislike the actual mtl classes (they are too generic, combined with instance uniqueness that's a PITA), mtl-style classes for high level operations work quite well |
| 10:45:55 | × | CiaoSen quits (~Jura@p200300c957184d002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
| 10:46:29 | <stefan-_> | merijn, isnt pure IO harder to test? |
| 10:47:03 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:7c30:9144:ce25:cdcc) (Ping timeout: 255 seconds) |
| 10:47:31 | <merijn> | stefan-_: compared to? |
| 10:48:01 | <stefan-_> | for example compared to providing a custom type class with different implementations for production and testing |
| 10:48:44 | × | michalz quits (~michalz@185.246.204.125) (Read error: Connection reset by peer) |
| 10:48:53 | <merijn> | I don't see much value in "a different implementation for testing", what's the value of tests if they're running wildly different code then production? |
| 10:49:02 | → | michalz joins (~michalz@185.246.204.101) |
| 10:49:32 | <turlando> | Isn't that kind of an antipattern? Can't you just pass different implementations to your functions at that point? If code complexity doesn't explode. Not sure if I got the question right actually |
| 10:50:12 | → | gmg joins (~user@user/gehmehgeh) |
| 10:50:32 | <merijn> | I consider upwards of 90% of mocking and similar things an antipattern :p |
| 10:51:11 | × | gehmehgeh quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 10:51:51 | → | bhall joins (~brunohall@195.147.207.136) |
| 10:52:37 | <turlando> | Also talking about antipatterns is an antipattern |
| 10:53:08 | → | __monty__ joins (~toonn@user/toonn) |
| 10:58:45 | <stefan-_> | merijn, it allows you to test units in isolation |
| 10:59:33 | → | freeside joins (~mengwong@103.252.202.170) |
| 11:00:22 | <merijn> | Except you're not testing in isolation, you're still *also* exercising the surrounding code (and potentially triggering bugs in that), except instead of exercising your surrounding production code (good!), you are exercising the entirely useless test code |
| 11:00:45 | <kuribas> | This, and in python it's 99.9% of mocking |
| 11:01:14 | <kuribas> | You can mock if you don't have a choice, and then you need to be careful that the mocking code actually matches the thing you mock closely. |
| 11:01:21 | <kuribas> | But no reason to mock database calls. |
| 11:04:14 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 260 seconds) |
| 11:04:43 | × | nschoe quits (~q@141.101.51.197) (Ping timeout: 248 seconds) |
| 11:05:03 | <kuribas> | It also makes sense to take out business logic into pure code. |
| 11:05:07 | <kuribas> | That can be tested. |
| 11:05:30 | <kuribas> | But often you just have light wrapper code, in that case it's just better to test with the thing you wrap. |
| 11:05:47 | × | razetime quits (~Thunderbi@117.193.0.210) (Ping timeout: 248 seconds) |
| 11:10:20 | → | xff0x joins (~xff0x@2405:6580:b080:900:876a:aa31:e2c4:b726) |
| 11:12:31 | → | freeside joins (~mengwong@103.252.202.170) |
| 11:14:52 | → | Feuermagier joins (~Feuermagi@user/feuermagier) |
| 11:15:31 | <tomsmeding> | disclaimer, I have worked very little with actually large production codebases |
| 11:15:54 | <tomsmeding> | is excessive use of mocking a sign that setting up a production environment for the application is too difficult? |
| 11:16:16 | <dminuoso> | Indeed, whatever the reason may be. |
| 11:16:20 | → | jludwig joins (~justin@li657-110.members.linode.com) |
| 11:16:26 | <tomsmeding> | when kuribas says "no reason to mock database calls", I say "there is, I hate having to set up a postgres instance on my machine just to test this bloody piece of code" |
| 11:16:41 | <tomsmeding> | but that can be reinterpreted into what I said above |
| 11:17:03 | <dminuoso> | I've started to love nix even further because nixos-lib tests are so amazing. |
| 11:17:07 | <tomsmeding> | I don't test ircbrowse locally because I don't want to set up postgres locally |
| 11:17:25 | <dminuoso> | You can very easily wire up postgresql, multiple VMs, do wireguard between them, and what not |
| 11:17:25 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 260 seconds) |
| 11:17:26 | <kuribas> | tomsmeding: you just let the infra guys set this up :) |
| 11:17:27 | <tomsmeding> | (now ircbrowse gets like 2 commits per year so it's not like that's a critical problem, but eh) |
| 11:17:27 | <dminuoso> | and then do your tests. |
| 11:17:40 | <dminuoso> | tomsmeding: You should use nix then! :p |
| 11:17:47 | <tomsmeding> | dminuoso: I can also set up a docker container and do tests in that, I know how that works to an extent |
| 11:17:56 | <kuribas> | tomsmeding: then you run the code on the CI/CD to see if it checks :) |
| 11:18:05 | <tomsmeding> | I... could |
| 11:18:07 | <dminuoso> | tomsmeding: the nasty thing about docker is you dont have a coherent language on how to configure the postgresql inside. |
| 11:18:18 | <dminuoso> | tomsmeding: you get that mess of a large bunch of dockerfiles, that you must somehow construct. |
| 11:18:38 | <kuribas> | tomsmeding: but if your code depends on queries which are non-trivial, you will want to test them anyway. |
| 11:18:39 | <tomsmeding> | dminuoso: nothing has a coherent language to configure postgresql and haskell and ircbrowse |
| 11:18:52 | <tomsmeding> | kuribas: I'm not disputing that |
| 11:18:53 | <dminuoso> | tomsmeding: nix does :o |
| 11:19:00 | <tomsmeding> | I'm not saying that "not testing" is a good thing :p |
| 11:19:02 | <dminuoso> | well nixos rather. |
| 11:19:07 | × | use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) (Quit: use-value) |
| 11:19:12 | × | coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot) |
| 11:19:23 | <tomsmeding> | dminuoso: _configuring_ postgresql? Including setting up users and databases? |
| 11:19:28 | <dminuoso> | tomsmeding: Yes. |
| 11:19:33 | tomsmeding | impressed |
| 11:19:50 | <tomsmeding> | this, by the way, is why pastebin and playground use sqlite |
| 11:19:56 | <tomsmeding> | you know how I set up a local sqlite database? |
| 11:19:58 | <tomsmeding> | I don't |
| 11:19:59 | <kuribas> | tomsmeding: not implying you did :) But if you are testing this already, the mocks seems superfluous. |
| 11:20:02 | <tomsmeding> | it gets created automaticallu |
| 11:20:18 | <tomsmeding> | kuribas: if you're testing what already? |
| 11:20:29 | <kuribas> | queries, integration... |
| 11:20:33 | <tomsmeding> | true |
| 11:20:52 | <tomsmeding> | if you're testing your queries against the real database, you have a real database to test against, so you shouldn't go mocking your real database |
| 11:21:17 | <tomsmeding> | which I guess is what you're saying |
| 11:21:35 | <kuribas> | indeed |
| 11:22:09 | <tomsmeding> | if running against the real thing was as easy as running against a mock, then you can save effort by not writing the mock |
| 11:22:14 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 11:22:20 | <tomsmeding> | hence my claim, mocks are a sign that running a production environment is too hard |
| 11:22:50 | <tomsmeding> | which, granted, might be because it's actually almost impossible due to needing to interface with licensed external services or other crap |
| 11:22:54 | <tomsmeding> | which I guess occurs in companies |
| 11:23:02 | <dminuoso> | tomsmeding: Let me conjure up a simple example |
| 11:23:06 | <tomsmeding> | but then you want CI |
| 11:23:10 | <tomsmeding> | which _can_ |
| 11:23:19 | <tomsmeding> | dminuoso: don't spend time on it :p |
| 11:23:31 | <tomsmeding> | dminuoso: I won't be using it for ircbrowse because I'm too lazy there anyway |
| 11:23:39 | <tomsmeding> | I mean, I'm curious, but you know |
| 11:26:38 | × | gtdg quits (~gtdg@user/gtdg) (Ping timeout: 260 seconds) |
| 11:29:09 | <dminuoso> | tomsmeding: https://gist.github.com/dminuoso/4b23c4c5636b3232b55b79a10d279110 |
| 11:29:34 | <dminuoso> | And of course, if you go all in with nixos anyway, you can just use whatever nixos config you push to your server directly |
| 11:29:58 | <dminuoso> | You can set up multiple VMs, coordinate tests between them, wait on conditions between the servers |
| 11:29:59 | → | gmg joins (~user@user/gehmehgeh) |
| 11:30:00 | <dminuoso> | and all |
| 11:30:13 | → | irrgit__ joins (~irrgit@176.113.74.130) |
| 11:30:15 | <kuribas> | tomsmeding: btw, I had like 20 queries, and a batching query system which "just worked", except for 1 faulty query. |
| 11:30:47 | <kuribas> | tomsmeding: I didn't have tests, it was just tested in production (it's a tool internally used by OPS). |
| 11:30:58 | <tomsmeding> | dminuoso: that's cool |
| 11:31:03 | <tomsmeding> | what language is testScript written in? |
| 11:31:08 | <dminuoso> | Python |
| 11:31:12 | <tomsmeding> | (I get that's the least important point of the snippet) |
| 11:31:19 | <dminuoso> | You can get a repl from that context too for neat debugging |
| 11:31:23 | <tomsmeding> | nice |
| 11:31:47 | <tomsmeding> | kuribas: it was an internal tool? |
| 11:31:50 | <dminuoso> | It runs directly on qemu and it happens all inside nix. |
| 11:31:55 | → | razetime joins (~Thunderbi@117.193.0.210) |
| 11:32:01 | <tomsmeding> | dminuoso: QEMU? that was... unexpected |
| 11:32:02 | <dminuoso> | So all you have to do is `nix-build test.nix` and it will do all the things |
| 11:32:04 | <kuribas> | tomsmeding: yes |
| 11:32:16 | <tomsmeding> | dminuoso: why does this start up a VM |
| 11:32:18 | <kuribas> | tomsmeding: except now it's being rewritten in clojure :( |
| 11:32:22 | <tomsmeding> | kuribas: F |
| 11:32:31 | <tomsmeding> | how did you find out about the faulty query |
| 11:32:38 | <dminuoso> | tomsmeding: well because its a multi machine test. You can set up multiple servers, and it will do networking between them. |
| 11:32:49 | <kuribas> | tomsmeding: it was OPS :-P |
| 11:33:07 | <dminuoso> | so for example if your reality already is "separate database" and "separate web server", this lets you not just "mimic it", but construct it as if it were reality |
| 11:33:14 | <dminuoso> | it will then push the nixos closure *as you want it* to those VMs |
| 11:33:17 | <tomsmeding> | /define OPS |
| 11:33:18 | <dminuoso> | so you can test entire server setups |
| 11:33:21 | <kuribas> | tomsmeding: the query itself was valid, but looking for a wrong datapath that didn't exist, so not returning those values. |
| 11:33:21 | <dminuoso> | not just singular software. |
| 11:33:24 | × | irrgit_ quits (~irrgit@89.47.234.74) (Ping timeout: 260 seconds) |
| 11:33:33 | <dminuoso> | tomsmeding: so think of it as a wholemeal server configuration test framework. |
| 11:33:38 | <tomsmeding> | dminuoso: oooooh |
| 11:33:52 | <dminuoso> | for nixos servers. |
| 11:33:53 | <tomsmeding> | kuribas: ah |
| 11:34:08 | <tomsmeding> | dminuoso: sneaky postscript |
| 11:34:09 | <dminuoso> | you can of course use this for non-nixos situations, where you just use nixos to quickly get a database up and running |
| 11:34:12 | → | irrgit_ joins (~irrgit@176.113.74.130) |
| 11:34:25 | <tomsmeding> | right, that makes sense |
| 11:35:03 | <dminuoso> | much of nixos modules (the things that define what options are available, and what they do) are in fact tested with the same machinery |
| 11:35:05 | <kuribas> | tomsmeding: but the effort required for testing all those queries, including the batching, would be way more than the time it took for OPS to find it and for me to fix it/ |
| 11:35:10 | <dminuoso> | which is something you dont have much in other distributions |
| 11:35:12 | × | irrgit__ quits (~irrgit@176.113.74.130) (Ping timeout: 255 seconds) |
| 11:35:20 | <tomsmeding> | kuribas: :) |
| 11:36:10 | <dminuoso> | What i found amazing, is when I forgot to enable hardware virtualization support in my CPU, that for one of our projects the qemu-based test suite still finished in about 40ish seconds. |
| 11:36:21 | <tomsmeding> | heh because qemu is cool |
| 11:36:27 | <dminuoso> | With kvm working, it was sped up to about 4-5s (that's including setup, running, and teardown) |
| 11:36:32 | <dminuoso> | but 40ish seconds is still amazing fast. |
| 11:36:35 | <tomsmeding> | yeah |
| 11:36:35 | <dminuoso> | for full blown cpu emulation |
| 11:36:45 | <tomsmeding> | so factor 10 slowdown, roundabout? |
| 11:36:47 | <tomsmeding> | that's nice |
| 11:36:48 | <dminuoso> | yeah |
| 11:37:05 | tomsmeding | wonders if QEMU does JIT |
| 11:37:15 | <dminuoso> | It does |
| 11:37:17 | <tomsmeding> | then that could be even faster perhaps |
| 11:37:32 | <tomsmeding> | though it's a hard language to jit I guess |
| 11:38:02 | <dminuoso> | There's TCG |
| 11:38:17 | <tomsmeding> | nice name |
| 11:38:27 | <dminuoso> | Its quite possible, that if the target architecture is the same as the native hardware, then performance hits arent too bad |
| 11:38:39 | <dminuoso> | because mostly qemu just has to emulate sysenter and memory |
| 11:38:56 | <tomsmeding> | well memory emulation is a thing :p |
| 11:39:08 | <tomsmeding> | significant proportion of instructions do something with memory |
| 11:39:11 | <dminuoso> | sure, but Im saying that much of the cpu instructions can be translated 1:1 |
| 11:39:16 | <tomsmeding> | hardly |
| 11:39:31 | <dminuoso> | Mmm |
| 11:39:34 | <tomsmeding> | a large percentage of instructions in a production app are memory-using instructions |
| 11:39:51 | <tomsmeding> | if you're doing significant numerical calculations you may have chunks of code that use registers only |
| 11:39:58 | <tomsmeding> | but that's not really what crud apps do |
| 11:40:31 | <tomsmeding> | but cool stuff, I wasn't aware of all this |
| 11:40:35 | <dminuoso> | I would have expected a much much steeper slowdown |
| 11:40:42 | <dminuoso> | Something factor 100 or so |
| 11:40:45 | <tomsmeding> | without JIT yes for sure |
| 11:41:00 | <tomsmeding> | with JIT I might have expected it to be a little faster than 10x actually |
| 11:41:03 | <tomsmeding> | but not much per se |
| 11:41:17 | <tomsmeding> | because the language you're JITting is too low level |
| 11:42:43 | → | coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) |
| 11:43:10 | <dminuoso> | Also in related nix news, with haskell.nix to build a fully statically linked binary, all I had to do is replace `pkgs` with `pkgs.pkgsCross.musl64`, and by pure magic a statically linked haskell executable fell out. |
| 11:43:51 | <dminuoso> | For reasons that are somewhat beyond me, its also only 10MiB in size compared to 40ish MiB when built inside an alpine container with `cabal-install` |
| 11:44:09 | <dminuoso> | despite latter having been `stripped` and the former not. |
| 11:44:12 | <tomsmeding> | dminuoso: what do you get if you `nm` the resulting executable |
| 11:44:13 | <tomsmeding> | oh |
| 11:44:17 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 11:44:21 | <tomsmeding> | what if you don't strip :p |
| 11:44:29 | <dminuoso> | then the alpine thing gets even larger? |
| 11:44:30 | → | gmg joins (~user@user/gehmehgeh) |
| 11:44:37 | <dminuoso> | But it may also be just the GHC version |
| 11:44:44 | <tomsmeding> | yeah but I wonder if there are more functions in there, hence more names |
| 11:44:46 | <dminuoso> | since in nix Im using 9.2 now |
| 11:44:48 | <tomsmeding> | ah |
| 11:44:55 | <dminuoso> | and on alpine it was 8.10 I think |
| 11:45:01 | <tomsmeding> | that's definitely a possibly large confounding factor |
| 11:55:50 | → | underlap joins (~underlap@229.171.115.87.dyn.plus.net) |
| 11:57:42 | → | CiaoSen joins (~Jura@p200300c957184d002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 12:00:56 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 12:03:25 | → | freeside joins (~mengwong@103.252.202.170) |
| 12:08:28 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 268 seconds) |
| 12:12:59 | <underlap> | I have been successfully using stack on macOS, but I am trying it now on linux and am consistently getting connection failures (error: [S-775]). Any clues for how to debug this please? |
| 12:13:05 | <underlap> | Error: [S-775] |
| 12:13:05 | <underlap> | Exception while reading snapshot from https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/20/9.yaml (c11fcbeb1aa12761044755b1109d16952ede2cb6147ebde777dd5cb38f784501,649333): |
| 12:13:05 | <underlap> | HttpExceptionRequest Request { |
| 12:13:05 | <underlap> | host = "raw.githubusercontent.com" |
| 12:13:05 | <underlap> | port = 443 |
| 12:13:06 | <underlap> | secure = True |
| 12:13:08 | <underlap> | requestHeaders = [("User-Agent","Haskell pantry package")] |
| 12:13:10 | <underlap> | path = "/commercialhaskell/stackage-snapshots/master/lts/20/9.yaml" |
| 12:13:12 | <underlap> | queryString = "" |
| 12:13:14 | <underlap> | method = "GET" |
| 12:13:16 | <underlap> | proxy = Nothing |
| 12:13:18 | <underlap> | rawBody = False |
| 12:13:20 | <underlap> | redirectCount = 10 |
| 12:13:22 | <underlap> | responseTimeout = ResponseTimeoutDefault |
| 12:13:26 | <underlap> | requestVersion = HTTP/1.1 |
| 12:13:28 | <underlap> | proxySecureMode = ProxySecureWithConnect |
| 12:13:30 | <underlap> | } |
| 12:13:32 | <underlap> | (ConnectionFailure Network.Socket.getAddrInfo (called with preferred socket type/protocol: AddrInfo {addrFlags = [AI_ADDRCONFIG], addrFamily = AF_UNSPEC, addrSocketType = Stream, addrProtocol = 0, addrAddress = 0.0.0.0:0, addrCanonName = Nothing}, host name: Just "raw.githubusercontent.com", service name: Just "443"): does not exist (Try again)) |
| 12:13:36 | × | jludwig quits (~justin@li657-110.members.linode.com) (Quit: ZNC - https://znc.in) |
| 12:14:21 | <maerwald> | underlap: please don't paste more than 3 lines into the channel |
| 12:14:24 | <underlap> | If I open the link in a browser, I can see the YAML contents ok. |
| 12:14:31 | <maerwald> | @where paste |
| 12:14:31 | <lambdabot> | Help us help you: please paste full code, input and/or output at e.g. https://paste.tomsmeding.com |
| 12:14:39 | <underlap> | maerwald: oops sorry |
| 12:15:28 | <underlap> | Here's the output: https://paste.tomsmeding.com/DpvUkIXo |
| 12:18:36 | → | gmg joins (~user@user/gehmehgeh) |
| 12:21:20 | × | akegalj quits (~akegalj@93-138-121-55.adsl.net.t-com.hr) (Quit: leaving) |
| 12:22:17 | <underlap> | In case the above was garbled, I am issuing `stack test` on linux against a project which works fine on macOS and I get the connection failure error shown here: https://paste.tomsmeding.com/DpvUkIXo Any clue for debugging this please? |
| 12:24:31 | <mauke> | that sounds like it couldn't resolve the raw.githubusercontent.com hostname |
| 12:24:37 | <mauke> | network issue? |
| 12:25:39 | <underlap> | Probably. Just found a useful clue... |
| 12:26:50 | → | mmhat joins (~mmh@p200300f1c7069003ee086bfffe095315.dip0.t-ipconnect.de) |
| 12:27:26 | <underlap> | Ah, turns out it was a known issue with arch linux: https://github.com/commercialhaskell/stack/issues/5634 |
| 12:27:46 | <underlap> | Sorry for troubling you (and for flooding the chat earlier!) |
| 12:28:50 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 12:29:42 | → | nschoe joins (~q@141.101.51.197) |
| 12:30:33 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Quit: leaving) |
| 12:31:37 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 12:33:38 | → | gmg joins (~user@user/gehmehgeh) |
| 12:33:48 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Client Quit) |
| 12:34:01 | × | lisbeths quits (uid135845@id-135845.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 12:34:30 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 12:38:17 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 12:39:05 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Client Quit) |
| 12:39:26 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 12:41:19 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Client Quit) |
| 12:41:40 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 12:41:50 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Client Quit) |
| 12:42:07 | → | gmg joins (~user@user/gehmehgeh) |
| 12:42:55 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 12:44:17 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Client Quit) |
| 12:44:36 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) |
| 12:44:40 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 12:44:40 | × | machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Client Quit) |
| 12:45:04 | → | machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net) |
| 12:46:20 | → | freeside joins (~mengwong@103.252.202.170) |
| 12:46:50 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 12:48:08 | → | gmg joins (~user@user/gehmehgeh) |
| 12:49:07 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) (Ping timeout: 252 seconds) |
| 12:51:01 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 268 seconds) |
| 12:52:58 | → | jludwig joins (~justin@li657-110.members.linode.com) |
| 12:55:45 | × | underlap quits (~underlap@229.171.115.87.dyn.plus.net) (Quit: Leaving) |
| 12:57:12 | → | gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) |
| 12:57:38 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 255 seconds) |
| 13:07:21 | → | Kaizer joins (~kaizer@user/Kaizer) |
| 13:09:19 | → | pernzs joins (~pernzs@101.175.168.100) |
| 13:14:42 | × | razetime quits (~Thunderbi@117.193.0.210) (Remote host closed the connection) |
| 13:20:45 | → | dgpratt[m] joins (~dgprattma@2001:470:69fc:105::1:dcdd) |
| 13:21:43 | × | Kaizer quits (~kaizer@user/Kaizer) (Remote host closed the connection) |
| 13:27:58 | × | notzmv quits (~zmv@user/notzmv) (Remote host closed the connection) |
| 13:29:15 | × | mmhat quits (~mmh@p200300f1c7069003ee086bfffe095315.dip0.t-ipconnect.de) (Ping timeout: 248 seconds) |
| 13:31:06 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 13:31:56 | × | dsrt^ quits (~dsrt@c-24-30-76-89.hsd1.ga.comcast.net) (Remote host closed the connection) |
| 13:36:27 | × | andrewboltachev quits (~andrey@178.141.147.162) (Quit: Leaving.) |
| 13:41:08 | → | akegalj joins (~akegalj@37-128.dsl.iskon.hr) |
| 13:44:47 | → | mmhat joins (~mmh@p200300f1c716b0c2ee086bfffe095315.dip0.t-ipconnect.de) |
| 13:44:47 | × | gentauro quits (~gentauro@user/gentauro) (Read error: Connection reset by peer) |
| 13:47:16 | × | cheater quits (~Username@user/cheater) (Ping timeout: 252 seconds) |
| 13:50:13 | → | gentauro joins (~gentauro@user/gentauro) |
| 13:53:20 | → | buggy joins (~buggy@14.139.82.6) |
| 13:53:34 | × | buggy quits (~buggy@14.139.82.6) (Client Quit) |
| 13:54:41 | × | enoq quits (~enoq@2a05:1141:1f5:5600:b9c9:721a:599:bfe7) (Remote host closed the connection) |
| 13:56:00 | → | enoq joins (~enoq@2a05:1141:1f5:5600:b9c9:721a:599:bfe7) |
| 13:59:12 | × | coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot) |
| 14:05:18 | × | tristanC_ quits (~tristanC@user/tristanc) (Remote host closed the connection) |
| 14:07:15 | → | troydm joins (~troydm@user/troydm) |
| 14:11:21 | → | ddellacosta joins (~ddellacos@143.244.47.81) |
| 14:12:27 | × | bhall quits (~brunohall@195.147.207.136) (Ping timeout: 248 seconds) |
| 14:18:19 | → | thegeekinside joins (~thegeekin@189.180.83.186) |
| 14:19:23 | → | freeside joins (~mengwong@103.252.202.170) |
| 14:21:30 | → | rettahcay joins (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) |
| 14:22:38 | ← | rettahcay parts (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) () |
| 14:23:27 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds) |
| 14:24:03 | → | rettahcay joins (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) |
| 14:29:04 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 252 seconds) |
| 14:30:59 | → | coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) |
| 14:34:42 | × | rettahcay quits (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) (Quit: leaving) |
| 14:35:24 | → | rettahcay joins (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) |
| 14:36:08 | <rettahcay> | whois rettahcay |
| 14:36:44 | <Hecate> | no idea |
| 14:37:16 | → | Midjak joins (~Midjak@82.66.147.146) |
| 14:37:46 | <rettahcay> | never mind! sorry :-) |
| 14:38:38 | × | rettahcay quits (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) (Client Quit) |
| 14:41:47 | → | freeside joins (~mengwong@103.252.202.170) |
| 14:42:03 | → | rettahcay joins (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) |
| 14:44:08 | <jean-paul[m]> | with megaparsec, is the definition of a Parser a, is there a way to compose with a Parser b but require that it match exactly some number of tokens? (eg, to implement parsing of the values inside netstrings) |
| 14:44:38 | <rettahcay> | hello folks. I'm a haskell beginner. looking for a good resource to learn Monads. Any suggestions? Thanks |
| 14:44:43 | <jean-paul[m]> | I wrote a thing where I just call parse again inside the Parser a and do a bunch of work to convert the error type of parse back to the internal error type of Parser ... it's so gross |
| 14:45:57 | × | gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.8) |
| 14:46:22 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 14:48:23 | <merijn> | rettahcay: How beginner are we talking? :) |
| 14:48:29 | <ddellacosta> | rettahcay: I think Graham Hutton's explanation in Programming in Haskell is very good http://www.cs.nott.ac.uk/~pszgmh/pih.html Roughly the same as what you can find here I believe, so you don't have to buy the book to see http://www.cs.nott.ac.uk/~pszgmh/bib.html#pearl I'm making some assumptions about what you're comfortable with--but honestly, there are plenty of great resources for this and |
| 14:48:31 | <ddellacosta> | it will probably take banging your head against it for a while until it clicks. Don't give up and keep asking questions. |
| 14:51:18 | <geekosaur> | @where iotut |
| 14:51:18 | <lambdabot> | https://www.vex.net/~trebla/haskell/IO.xhtml |
| 14:52:04 | <geekosaur> | there's not actually a lot to understand about monads as such. there's a lot to understand about IO, but IO is special because it's IO, not because it's a monad |
| 14:54:12 | → | kurbus joins (~kurbus@user/kurbus) |
| 14:55:03 | → | jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) |
| 14:58:16 | × | kurbus quits (~kurbus@user/kurbus) (Client Quit) |
| 14:58:22 | → | kurbus31 joins (~kurbus@user/kurbus) |
| 14:58:35 | kurbus31 | is now known as kurbus |
| 15:02:43 | → | jero98772 joins (~jero98772@2800:484:1d80:d8ce:9815:cfda:3661:17bb) |
| 15:03:43 | → | Guest3769 joins (~Guest37@ip1f13ab93.dynamic.kabel-deutschland.de) |
| 15:06:15 | × | pernzs quits (~pernzs@101.175.168.100) (Quit: Client closed) |
| 15:07:34 | × | Luj quits (~Luj@2a01:e0a:5f9:9681:5880:c9ff:fe9f:3dfb) (Quit: The Lounge - https://thelounge.chat) |
| 15:08:27 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 15:08:40 | → | Luj joins (~Luj@2a01:e0a:5f9:9681:e45d:27d5:311f:767e) |
| 15:11:29 | → | hounded joins (~hounded@2603-7000-da43-eccc-0000-0000-0000-0cec.res6.spectrum.com) |
| 15:11:49 | → | hounded_woodstoc joins (~hounded@2603-7000-da43-eccc-0000-0000-0000-0cec.res6.spectrum.com) |
| 15:13:04 | × | mei quits (~mei@user/mei) (Ping timeout: 252 seconds) |
| 15:17:31 | × | mechap quits (~mechap@user/mechap) (Ping timeout: 248 seconds) |
| 15:17:36 | → | Guest31 joins (~Guest31@45.247.234.245) |
| 15:19:43 | → | mechap joins (~mechap@user/mechap) |
| 15:22:19 | → | [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470) |
| 15:23:08 | → | cheater joins (~Username@user/cheater) |
| 15:31:55 | → | marinelli joins (~marinelli@gateway/tor-sasl/marinelli) |
| 15:34:18 | × | rettahcay quits (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) (Quit: leaving) |
| 15:36:18 | → | varoo joins (~varoo@2a09:bac1:3680:5f70::ca:84) |
| 15:36:45 | × | Guest3769 quits (~Guest37@ip1f13ab93.dynamic.kabel-deutschland.de) (Quit: Client closed) |
| 15:36:49 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 15:38:16 | × | ddellacosta quits (~ddellacos@143.244.47.81) (Quit: WeeChat 3.7.1) |
| 15:38:19 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 248 seconds) |
| 15:38:31 | → | ddellacosta joins (~ddellacos@143.244.47.81) |
| 15:39:21 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:a8f5:3359:54ee:1396) (Quit: WeeChat 2.8) |
| 15:40:02 | × | varoo quits (~varoo@2a09:bac1:3680:5f70::ca:84) (Client Quit) |
| 15:42:22 | <kuribas> | geekosaur: interestingly, IO was modelled after monads. |
| 15:42:33 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 15:44:38 | × | marinelli quits (~marinelli@gateway/tor-sasl/marinelli) (Quit: marinelli) |
| 15:44:45 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 15:45:35 | → | Guest33 joins (~Guest33@187.22.78.128) |
| 15:46:26 | → | waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) |
| 15:47:31 | <c_wraith> | kuribas: I'm not sure that's the phrasing I'd use. I'd probably say something like "the IO type was constructed to be a monad". You can imagine an alternate construction that is based more on something like the Arrow hierarchy |
| 15:47:45 | <c_wraith> | And probably several others |
| 15:47:54 | <kuribas> | gotta restart emacs... |
| 15:47:57 | × | kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Quit: ERC (IRC client for Emacs 27.1)) |
| 15:48:31 | → | kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be) |
| 15:49:13 | → | codaraxis joins (~codaraxis@user/codaraxis) |
| 15:50:04 | × | codaraxis quits (~codaraxis@user/codaraxis) (Remote host closed the connection) |
| 15:50:04 | <monochrom> | Instead of who is modelled after whom, it is "the unreasonable effectiveness of math" again. |
| 15:50:09 | → | mei joins (~mei@user/mei) |
| 15:50:29 | → | codaraxis joins (~codaraxis@user/codaraxis) |
| 15:51:42 | × | codaraxis quits (~codaraxis@user/codaraxis) (Max SendQ exceeded) |
| 15:52:10 | → | codaraxis joins (~codaraxis@user/codaraxis) |
| 15:52:15 | <monochrom> | Sound waves are not modelled after Fourier series, nor Fourier series modelled after sound waves. Instead, someone noticed that they are a good match. |
| 15:52:36 | <kuribas> | for sure. I am just surprised nobody came up with this pattern before monads. |
| 15:52:44 | <kuribas> | In hindsight it looks obvious. |
| 15:52:49 | × | nattiestnate quits (~nate@202.138.250.11) (Ping timeout: 252 seconds) |
| 15:52:54 | <monochrom> | And to be sure Fourier series is not the only good fit. There are wavelet transforms too. |
| 15:53:54 | → | nattiestnate joins (~nate@202.138.250.13) |
| 15:55:24 | <monochrom> | Sufficiently old Haskell did not use monads. I/O was [Respond]->[Request] and someone noticed it could be given a CPS interface. |
| 15:55:55 | × | CiaoSen quits (~Jura@p200300c957184d002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 248 seconds) |
| 15:57:28 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Quit: ZNC 1.8.2 - https://znc.in) |
| 15:57:36 | <kuribas> | forall a. ([Request -> a]) -> [Respond] -> a ? |
| 15:57:47 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 15:57:55 | <merijn> | No |
| 15:58:28 | <c_wraith> | that old version was frighteningly fragile |
| 15:58:41 | <merijn> | Just "main :: [Response] -> [Request]" where the input is a lazy list of responses to the (lazy list of) requests produced |
| 15:59:07 | <merijn> | If you look up old versions of the Haskell Report you can read up on the details |
| 15:59:10 | <kuribas> | that's not CPS. |
| 15:59:51 | <merijn> | kuribas: Pretty sure monochrom meant that IO is hiding that CPS interface |
| 16:00:24 | <merijn> | kuribas: I mean, Clean uses neither monads nor the lazy list approach for IO |
| 16:00:57 | <monochrom> | No I meant what I wrote, in particular this was before Haskell got monads. |
| 16:01:08 | <kuribas> | merijn: so it already had bind? |
| 16:02:05 | <merijn> | monochrom: I don't recall seeing CPS based IO in any of the old reports? |
| 16:02:12 | <merijn> | kuribas: What did? |
| 16:03:03 | <kuribas> | old haskell |
| 16:03:14 | <merijn> | Mu |
| 16:03:27 | <mauke> | monads first appeared in 1.3 |
| 16:03:32 | <mauke> | let me check 1.2 ... |
| 16:03:52 | <merijn> | mauke: I thought monadic IO was 1.4? But I might be wrong, could be 1.3 |
| 16:04:34 | <merijn> | kuribas: "Haskell already had bind" is a real "define 'already', 'had', and 'bind'" kinda question |
| 16:04:52 | <monochrom> | You will need a postscript viewer, but it's https://www.haskell.org/definition/from12to13.html section 7.5 |
| 16:05:22 | <mauke> | yep, just found it |
| 16:06:07 | <merijn> | Monadic IO is just so obviously better when you look at the old stuff :) |
| 16:06:59 | <monochrom> | Alternatively find Andrew Gordon's thesis Functional Programming and Input/Output for many more options. :) |
| 16:07:07 | → | kee joins (~~kee@user/wizzwizz4) |
| 16:07:37 | → | razetime joins (~Thunderbi@117.193.0.210) |
| 16:08:02 | <mauke> | readFile :: String -> FailCont -> StrCont -> [Response] -> [Request] |
| 16:08:03 | <mauke> | not fun |
| 16:08:30 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 260 seconds) |
| 16:08:53 | <mauke> | type FailCont = IOError -> [Response] -> [Request]; type StrCont = String -> [Response] -> [Request] |
| 16:09:03 | <monochrom> | But it solved the "I hate exceptions, what should I do instead?" problem. >:) |
| 16:10:12 | → | use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:458d:a070:c030:aa2) |
| 16:10:12 | <mauke> | amazingly no one seems to have considered `type IOCont a = a -> [Response] -> [Request]` |
| 16:10:28 | <monochrom> | Yeah, I just noticed. :) |
| 16:10:50 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 16:11:06 | → | lbseale joins (~quassel@user/ep1ctetus) |
| 16:11:52 | <c_wraith> | That representation makes it so easy to introduce causality issues. |
| 16:12:12 | → | use-value1 joins (~Thunderbi@2a00:23c6:8a03:2f01:c5c6:bf70:ccc5:fecd) |
| 16:12:32 | <c_wraith> | It's so easy to look for a response to a request you haven't actually made yet. |
| 16:13:17 | × | kee quits (~~kee@user/wizzwizz4) (Ping timeout: 268 seconds) |
| 16:14:27 | × | use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:458d:a070:c030:aa2) (Ping timeout: 252 seconds) |
| 16:14:27 | use-value1 | is now known as use-value |
| 16:15:06 | → | steve[m]1 joins (~stevetrou@2001:470:69fc:105::e0b) |
| 16:18:44 | × | kurbus quits (~kurbus@user/kurbus) (Quit: Client closed) |
| 16:20:09 | × | mmhat quits (~mmh@p200300f1c716b0c2ee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.8) |
| 16:20:26 | → | kee joins (~~kee@user/wizzwizz4) |
| 16:21:55 | → | [_] joins (~itchyjunk@user/itchyjunk/x-7353470) |
| 16:22:10 | × | nschoe quits (~q@141.101.51.197) (Quit: Switching off) |
| 16:23:01 | → | andrewboltachev joins (~andrey@178.141.147.162) |
| 16:24:33 | × | [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 255 seconds) |
| 16:25:05 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 255 seconds) |
| 16:25:42 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 16:30:37 | × | merijn quits (~merijn@c-001-001-010.client.esciencecenter.eduvpn.nl) (Ping timeout: 252 seconds) |
| 16:33:35 | → | dcoutts_ joins (~duncan@host86-155-218-146.range86-155.btcentralplus.com) |
| 16:35:34 | × | dcoutts quits (~duncan@host86-176-29-74.range86-176.btcentralplus.com) (Ping timeout: 252 seconds) |
| 16:37:08 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 255 seconds) |
| 16:37:52 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 16:38:57 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 16:39:24 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 16:39:28 | [_] | is now known as [itchyjunk] |
| 16:39:56 | → | eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) |
| 16:40:24 | → | dcoutts joins (~duncan@host86-155-218-146.range86-155.btcentralplus.com) |
| 16:41:30 | → | rburkholder joins (~blurb@96.45.2.121) |
| 16:41:51 | → | motherfsck joins (~motherfsc@user/motherfsck) |
| 16:42:19 | × | dcoutts_ quits (~duncan@host86-155-218-146.range86-155.btcentralplus.com) (Ping timeout: 252 seconds) |
| 16:46:41 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 16:47:07 | → | cheater_ joins (~Username@user/cheater) |
| 16:47:08 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 255 seconds) |
| 16:47:54 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 16:49:29 | → | gmg joins (~user@user/gehmehgeh) |
| 16:49:47 | × | cheater quits (~Username@user/cheater) (Ping timeout: 248 seconds) |
| 16:49:51 | cheater_ | is now known as cheater |
| 16:52:04 | → | cheater_ joins (~Username@user/cheater) |
| 16:53:00 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 16:54:46 | × | waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 252 seconds) |
| 16:55:27 | × | Guest33 quits (~Guest33@187.22.78.128) (Quit: Client closed) |
| 16:55:45 | × | cheater quits (~Username@user/cheater) (Ping timeout: 260 seconds) |
| 16:55:48 | cheater_ | is now known as cheater |
| 16:55:54 | → | kurbus joins (~kurbus@user/kurbus) |
| 16:55:59 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 248 seconds) |
| 16:56:57 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 16:59:28 | → | merijn joins (~merijn@c-001-001-010.client.esciencecenter.eduvpn.nl) |
| 17:00:03 | → | notzmv joins (~zmv@user/notzmv) |
| 17:00:47 | → | kurbus27 joins (~kurbus@user/kurbus) |
| 17:01:08 | kurbus | is now known as Guest2389 |
| 17:01:08 | kurbus27 | is now known as kurbus |
| 17:01:42 | × | Guest2389 quits (~kurbus@user/kurbus) (Quit: Client closed) |
| 17:02:02 | → | patrl joins (~patrl@user/patrl) |
| 17:02:07 | × | werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Remote host closed the connection) |
| 17:03:10 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 17:05:44 | → | califax joins (~califax@user/califx) |
| 17:05:47 | <lechner> | Hi, is there a separate channel for Cabal? |
| 17:06:16 | × | kurbus quits (~kurbus@user/kurbus) (Quit: Client closed) |
| 17:07:39 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 260 seconds) |
| 17:07:44 | → | kurbus joins (~kurbus@user/kurbus) |
| 17:08:15 | × | eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
| 17:11:12 | × | razetime quits (~Thunderbi@117.193.0.210) (Remote host closed the connection) |
| 17:11:18 | × | kurbus quits (~kurbus@user/kurbus) (Client Quit) |
| 17:15:00 | × | Guest31 quits (~Guest31@45.247.234.245) (Quit: Client closed) |
| 17:15:43 | × | mechap quits (~mechap@user/mechap) (Read error: Connection reset by peer) |
| 17:17:12 | <mauke> | I don't know, but if so, it'll be called #haskell-cabal or #cabal, probably |
| 17:19:29 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 17:19:33 | <sclv> | lechner: the channel is named #hackage |
| 17:19:39 | × | merijn quits (~merijn@c-001-001-010.client.esciencecenter.eduvpn.nl) (Ping timeout: 248 seconds) |
| 17:20:16 | <lechner> | sclv / thanks! |
| 17:21:05 | → | mechap joins (~mechap@user/mechap) |
| 17:24:23 | <mauke> | Dang |
| 17:24:45 | <geekosaur> | yeh, it's confusing |
| 17:25:06 | <geekosaur> | also for hackage issues you go somewhere other than #hackage 🙂 |
| 17:26:19 | × | MajorBiscuit quits (~MajorBisc@145.94.153.3) (Ping timeout: 260 seconds) |
| 17:27:21 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 17:29:57 | → | califax joins (~califax@user/califx) |
| 17:30:05 | × | kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Quit: ERC (IRC client for Emacs 27.1)) |
| 17:30:54 | <lechner> | where is that? #haskell-infrastructure? |
| 17:31:17 | → | fut joins (~futar@129.234.0.191) |
| 17:32:06 | <geekosaur> | yep |
| 17:33:11 | <lechner> | it keeps all the riff-raff away |
| 17:33:12 | <geekosaur> | basically, #hackage is hackage development including cabal/Cabal, operational stuff is #haskell-infrastructure |
| 17:33:41 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 17:34:24 | <lechner> | i checked #cabal, which seemed taken, and #haskell-cabal before asking |
| 17:34:45 | × | fut quits (~futar@129.234.0.191) (Client Quit) |
| 17:36:07 | → | cheater_ joins (~Username@user/cheater) |
| 17:36:41 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) |
| 17:38:55 | × | cheater quits (~Username@user/cheater) (Ping timeout: 260 seconds) |
| 17:39:02 | cheater_ | is now known as cheater |
| 17:40:23 | × | cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 3.8) |
| 17:42:23 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 17:46:27 | × | chele quits (~chele@user/chele) (Remote host closed the connection) |
| 17:48:10 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 17:49:11 | → | slack1256 joins (~slack1256@186.11.102.104) |
| 17:50:26 | → | tzh joins (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) |
| 17:56:15 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 17:56:48 | × | asscrackbandit quits (~user@eth-west-pareq2-46-193-2-167.wb.wifirst.net) (Ping timeout: 248 seconds) |
| 17:58:22 | × | kayvank quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Remote host closed the connection) |
| 17:58:24 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 260 seconds) |
| 17:58:57 | → | califax joins (~califax@user/califx) |
| 17:59:01 | → | lyle joins (~lyle@104.246.145.85) |
| 18:01:26 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 18:02:01 | × | patrl quits (~patrl@user/patrl) (Quit: WeeChat 3.8) |
| 18:02:26 | × | mechap quits (~mechap@user/mechap) (Read error: Connection reset by peer) |
| 18:03:13 | → | califax joins (~califax@user/califx) |
| 18:04:10 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 18:04:27 | × | avicenzi quits (~avicenzi@2a00:ca8:a1f:b004::c32) (Ping timeout: 248 seconds) |
| 18:05:34 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 18:06:24 | → | rettahcay joins (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) |
| 18:06:51 | → | califax joins (~califax@user/califx) |
| 18:08:24 | → | mechap joins (~mechap@user/mechap) |
| 18:09:14 | × | rettahcay quits (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) (Quit: leaving) |
| 18:09:33 | → | rettahcay joins (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) |
| 18:10:52 | × | rettahcay quits (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) (Client Quit) |
| 18:12:00 | → | rettahcay joins (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) |
| 18:12:59 | ← | rettahcay parts (~kaushikv@c-24-20-37-193.hsd1.or.comcast.net) () |
| 18:14:03 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 18:15:42 | → | califax joins (~califax@user/califx) |
| 18:15:44 | <lyle> | I'm trying to find a library to parse http requests and responses. Here's my attempt at using a library called hweblib: https://paste.tomsmeding.com/CB3bFz3n but it doesn't let me access the fields since no accessor functions are exported. Do I just have a fundamental misunderstanding of how to use this library, or is there another library I should be using? |
| 18:17:02 | → | econo joins (uid147250@user/econo) |
| 18:23:27 | <ddellacosta> | lyle: did you try including the Response data constructor from Network.Types? I think you may just be missing that import |
| 18:24:05 | <ddellacosta> | https://hackage.haskell.org/package/hweblib-0.6.3/docs/Network-Types.html#t:Response |
| 18:25:47 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 18:27:06 | <jil> | hello |
| 18:27:13 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 18:27:25 | <jil> | what's the meaning of .\/ as in https://github.com/input-output-hk/plutus-pioneer-program/blob/main/code/week02/src/Week02/Gift.hs#L48 |
| 18:30:14 | <geekosaur> | it is presumably defined by Plutus, since I don't see it on hackage |
| 18:30:14 | × | Vajb quits (~Vajb@2001:999:404:9516:d621:6cbe:c71e:5686) (Read error: Connection reset by peer) |
| 18:30:25 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) |
| 18:30:39 | <lyle> | ddellacosta: thanks! That was it. I never would have thought to do that since network-types is not listed as a dependency for hweblib. |
| 18:31:39 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 248 seconds) |
| 18:32:14 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 260 seconds) |
| 18:32:19 | → | thongpv joins (~thongpv87@123.28.243.28) |
| 18:33:23 | → | cheater_ joins (~Username@user/cheater) |
| 18:33:34 | <lyle> | but I suppose it was right in the error in the paste so I guess lesson learned--I actually need to read the error! |
| 18:34:53 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 18:35:33 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 18:35:55 | × | cheater quits (~Username@user/cheater) (Ping timeout: 248 seconds) |
| 18:35:58 | cheater_ | is now known as cheater |
| 18:37:39 | × | use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:c5c6:bf70:ccc5:fecd) (Quit: use-value) |
| 18:37:51 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 18:38:06 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 18:38:17 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 18:38:41 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 18:38:53 | × | enoq quits (~enoq@2a05:1141:1f5:5600:b9c9:721a:599:bfe7) (Quit: enoq) |
| 18:39:27 | × | thongpv quits (~thongpv87@123.28.243.28) (Ping timeout: 248 seconds) |
| 18:46:06 | <ddellacosta> | lyle: awesome, glad it helped! |
| 18:47:07 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 18:47:20 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 18:47:59 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 260 seconds) |
| 18:48:08 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 18:48:23 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 18:51:55 | → | Mahi joins (~Mahi@91-159-147-164.elisa-laajakaista.fi) |
| 18:52:48 | <tomsmeding> | lyle: note that Network.Types is a _module_ within the _package_ hweblib |
| 18:53:03 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 18:53:12 | <tomsmeding> | there is no _package_ named network-types involved here |
| 18:53:18 | <Mahi> | Hi, I'm trying to implement a phonebook using binary tree, but the automatic testers at the university are not passing. I've included my code and the difference in outputs here: https://paste.tomsmeding.com/obSjuwK3 |
| 18:53:42 | <Mahi> | Any ideas what's wrong with my code? Nobody else is complaining with issues with the tester |
| 18:54:50 | → | ft joins (~ft@p508dbcc4.dip0.t-ipconnect.de) |
| 18:55:22 | <Mahi> | The `Phone_type2` is provided by teachers and the function `readPhone` converts strings to a `Phone` object |
| 18:56:00 | <Mahi> | Also the `data Phonebook` is provided by teachers |
| 18:56:20 | <Mahi> | I don't understand how my code is adding some phone numbers twice with different types :/ |
| 18:56:35 | <tomsmeding> | Mahi: is the - version your output or the + version? |
| 18:56:49 | <Mahi> | Mine is the `-` and the expected is the `+` |
| 18:57:32 | <Mahi> | The task explicitly mentions "In data Phonebook statement there is a list of phones for a name - so when adding an entry with an existing name it should be added to the list rather than creating a new node." |
| 18:57:55 | → | dcoutts_ joins (~duncan@host86-155-218-146.range86-155.btcentralplus.com) |
| 18:58:27 | → | freeside joins (~mengwong@103.252.202.170) |
| 18:58:53 | <tomsmeding> | Mahi: those "+358 123456789 (PrivateMobile)" things are strings? |
| 18:59:01 | × | ddellacosta quits (~ddellacos@143.244.47.81) (Quit: WeeChat 3.7.1) |
| 18:59:02 | <tomsmeding> | oh no Phone is a datatype |
| 18:59:07 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 18:59:20 | → | ddellacosta joins (~ddellacos@143.244.47.81) |
| 18:59:22 | <davean> | Mahi: Are you just missing something to see if you've already added it? |
| 18:59:28 | <tomsmeding> | are you sure that you shouldn't deduplicate on the actual numbers? i.e. add new numbers, but if the number is already there, replace the existing entry |
| 18:59:51 | <Mahi> | now that you ask it like that, no I'm not sure :D |
| 19:00:33 | × | dcoutts quits (~duncan@host86-155-218-146.range86-155.btcentralplus.com) (Ping timeout: 252 seconds) |
| 19:00:36 | <Mahi> | but we haven't learned how to replace an element in a list yet so I'm not sure if that's the issue |
| 19:01:59 | <Mahi> | I'll try to see if I can do it :D |
| 19:03:30 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 19:03:40 | → | dcoutts joins (~duncan@host86-155-218-146.range86-155.btcentralplus.com) |
| 19:03:49 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 19:03:59 | × | dcoutts_ quits (~duncan@host86-155-218-146.range86-155.btcentralplus.com) (Ping timeout: 248 seconds) |
| 19:04:01 | → | Vajb joins (~Vajb@2001:999:404:9516:d621:6cbe:c71e:5686) |
| 19:10:51 | <jean-paul[m]> | > jean-paul.: Not sure if it exactly fits your use case, but parser-combinators has Control.Monad.Permutation for parsing any permutation of a fixed number of fields |
| 19:10:51 | <jean-paul[m]> | merijn Thanks, this worked very nicely and cut a hundred lines off my parser. |
| 19:10:52 | <lambdabot> | <hint>:1:54: error: parse error on input ‘,’ |
| 19:11:02 | <Mahi> | Oh wow it passed now, thanks guys! tomsmeding davean |
| 19:11:24 | <Mahi> | They didn't even expect me to replace the existing number, they expected me to not do anything if a number already exists... but it's not mentioned anywhere in the task lol |
| 19:11:43 | → | Tuplanolla joins (~Tuplanoll@91-159-68-152.elisa-laajakaista.fi) |
| 19:12:11 | <jean-paul[m]> | fwiw https://gitlab.com/exarkun/chk.hs/-/blob/parse-uriextension/src/Tahoe/CHK/URIExtension.hs#L121-135 |
| 19:12:37 | <tomsmeding> | Mahi: "not mentioned anywhere" that sounds like a polite email to the lecturer is in order, suggesting either you've missed something or a sentence is missing from the assignment spec :) |
| 19:12:46 | <tomsmeding> | but nice |
| 19:12:57 | <Mahi> | Yes you're right, I'll do that :) Thank you very much! |
| 19:13:01 | × | Mahi quits (~Mahi@91-159-147-164.elisa-laajakaista.fi) (Quit: Client closed) |
| 19:13:08 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 19:13:23 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 19:20:07 | → | kurbus joins (~kurbus@user/kurbus) |
| 19:24:28 | → | rekahsoft joins (~rekahsoft@bras-base-orllon1122w-grc-05-174-88-194-86.dsl.bell.ca) |
| 19:24:35 | × | rekahsoft quits (~rekahsoft@bras-base-orllon1122w-grc-05-174-88-194-86.dsl.bell.ca) (Remote host closed the connection) |
| 19:28:56 | → | so-offish joins (~so-offish@2610:148:610:b66:21d9:e18a:fd7a:ab8) |
| 19:29:11 | → | rekahsoft joins (~rekahsoft@bras-base-orllon1122w-grc-05-174-88-194-86.dsl.bell.ca) |
| 19:30:21 | × | kurbus quits (~kurbus@user/kurbus) (Quit: Client closed) |
| 19:32:04 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 19:32:37 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) (Remote host closed the connection) |
| 19:33:31 | × | rekahsoft quits (~rekahsoft@bras-base-orllon1122w-grc-05-174-88-194-86.dsl.bell.ca) (Ping timeout: 248 seconds) |
| 19:37:06 | → | kayvan joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 19:37:47 | × | trev quits (~trev@user/trev) (Remote host closed the connection) |
| 19:38:45 | <kayvan> | 11:37 *** NAMES @ChanServ [_________] [exa] [itchyjunk] [Leary] [Ristovski] ___ _________ __monty__ _leo___ _xor aaRabbit[m] aaronm04 aaronv abrar absence acarrico acertain acidsys acro adamCS Adeon adium Adran aforemny agander_m AkechiShiro akegalj aku_ alanz albet70 Aleksejs Alex_test alexfmpe[m] AlexNoo AlexZenon alinab alloca alp ames AmyMalik analoq anatta anderson andjjj23 andreas303 AndreasK andrewboltachev A |
| 19:38:45 | <kayvan> | ngelz Ankhers anpad anthezium apache2 APic arcadewise ario aristid arkeet Arsen Artem[m] asm astra Athas auri avpx_ aweinstock AWizzArd Axman6 azimut azure_vermilion b0o b20n bah barrucadu bastelfreak Batzy bbhoss bcoppens beaky Benzi-Junior berberman beteigeuze bgamari bgamari[m] bgs biberu bigtestaccount[m bjobjo bjs Boarders___ bob bollu bonz060 bookshelfdave bradparker bsima bsima1 buhman Buliarous burakcan- bw |
| 19:38:45 | <kayvan> | bwe byorgey ByronJohnson c_wraith caasih Cale califax carbolymer carter CAT_S catern caubert cawfee cbarrett cdsmith chaitlatte0 cheater Cheery chessai chexum chreekat christiaanb christiansen[m] Christoph[m] chymera cjay Clint Clinton[m] cln codaraxis codedmart cods conjunctive coot cpli crns cross cstm[m] cyphase dagi41990 danso darkling davean davetapley davl dcoutts ddb ddellacosta defanor degraafk Deide dequbed |
| 19:38:45 | <kayvan> | dextaa dexter1 df dfg dfordivam1 dgb8 dgpratt[m] dibblego DigitalKiwi disco-dave[m] dispater dminuoso dmj` dolio Dominik[m]12 dragestil drdo drewolson drlkf dsal dtman34 dumptruckman dunj3 dy dykai[m] Dykam dyniec earthy ec_ echoreply econo edm edmundnoble edwardk edwtjo Ekho eL_Bart0 eldritch eldritchcookie[4 elevenkb[m] ell elvishjerricco emergence energizer ericjmorey[m] ericson2314 erisco EsoAlgo8 esph EvanR ev |
| 19:38:45 | <kayvan> | anrelf ezzieyguywuf famubu[m] Fangs farn_ feliix42_ fendor[m] Feuermagier fgaz fiddlerwoaroof_ filwisher FinnElija finsternis Firedancer Flow fluffyballoon flukiluke fluxit forell_ foul_owl fr33domlover Franciman freeside ft FurudeRika[m] fvr gabiruh gawen gaze___ gdd geekosaur geekosaur[m] gentauro ggb ghostbuster glguy glider glowcoil gmc_ gmg gnyeki GoldsteinQ gonz_______ goober Goodbye_Vincent gqplox[m] grfn Gue |
| 19:38:45 | <kayvan> | st3728 Guest585 Guest7839 Guest809 Guillaum[m] h2t haasn` Hafydd hamishmack hammond_ hank_ haritz haskl haveo_ hays heartburn heath Hecate hendi henrytill hexagoxel hexeme_ hexology hgolden hiredman hltk hnOsmium0001 Hobbyboy hololeap hongminhee hook54321 hounded hounded_woodstoc hpc hrberg hueso hugo hussam idnar Igloo ikervagyok[m] img immae incertia infinity0 Inst_ int-e integral intelligent_boat inversed iphy ir |
| 19:38:46 | <kayvan> | cbrowse_tom irrgit_ iteratee ix jackdk jackhill jakalx jakesyl____ jakzale jao jbalint jean-paul[m] JensPetersen[m] jero98772 jespada jil jimki jinsl- jinsun jjhoo_ jkoshy jle` jleightcap jludwig jmcantrell jmct jmdaemon jneira[m] jocke-l JoelMcCracken joeyh johnjaye johnw Jon JonathanWatson[m jonathanx Jonno_FTW jonrh jpds jrm JSharp jtmar juri_ justache jwiegley kadobanana Kamuela kaol_ kaskal Katarushisu kawen ka |
| 19:38:46 | <kayvan> | wzeg_ kayvan kee kimiamania kitzman kmein koala_man koolazer kosmikus kosmikus[m] koz kraftwerk28 kristjansson_ kritzefitz krjst kronicma1 L29Ah lagash_ lally laman1 lambdabot LambdaDuck lambdap237 landonf Las[m] lawt lbseale leah2 leahclarm lechner leeb lexi-lambda lieven lightandlight liskin lisq litharge Logio loonycyborg Lord_of_Life lottaquestions_ Luj lukec lyle lyxia m1dnight m5zs7k machinedgod madnight Maeda |
| 19:38:46 | <kayvan> | maerwald maerwald[m] malte MangoIV[m] ManofLetters[m] manwithluck maralorn marienz markasoftware MasseR46 masterbuilder matijja matthews Matthew|m mauke Maxdamantus maxfan8_ mc47 mcfrdy mcglk Me-me mechap meejah megaTherion megeve mei meinside melonai meooow merijn mesaoptimizer mhatta mht-wtf Miao[m] michalz micro Midjak mikko mimi1vx[m] mimmy mira MironZ mixphix mjs2600 mmaruseacph2 mniip Momentum mon_aaraj monoc |
| 19:38:47 | <kayvan> | hrom MonsoonSecrecy motherfsck Moyst mrmonday mrvdb mtjm mustafa mxs myme n1essa Natch natechan nattiestnate natto17 ncf nckx nek0 NemesisD nerdypepper nicm[m] nicole NiKaN niko nisstyre noctuks noctux Noinia nomagno nonzen noteness notzmv nrr____ nshepperd nshepperd2 nullsh nurupo oats Oden[m] ongy[m] opqdonut Orbstheorem orcus ormaaj ouroboros ozkutuk[m] p3n paddymahoney parseval Patternmaster peddie Pent pepeibor |
| 19:38:48 | <kayvan> | ra perrierjouet peutri phileasfogg Philonous phma PHO` pie_ pieguy128_ piele pierrot pja pjlsergeant__ poljar polux PotatoGim probie ProofTechnique psydroid Putonlalla q0r qhong_ Qudit quintasan_ Raito_Bezarius ralu1 Ram-Z Ranhir raoul raym rburkholder red-snail1 Rembane rembo10 remedan remexre rendar riatre_ ridcully_ ringo__ RMSBach robbert-vdh robertm rodental romes[m] rubin55 rune russruss S11001001 s4msung sa s |
| 19:38:48 | <kayvan> | a1 sajith samhh sammelweis SanchayanMaity santiagopim saolsen Sauvin sayola scav Sciencentistguy sclv SeanKing[m] sefidel segfaultfizzbuzz SethTisue sgarcia Sgeo shachaf shailangsa shawwwn shinjipf shreyasminocha shriekingnoise simpleauthority ski slack1256 sm sm2n sm[i] smichel17[m] smol-hors snek so-offish SoF son0p sphynx srid[m] srk SrPx sshine statusbot stefan-_ steve[m]1 stiell stilgart sudden superbil supersv |
| 19:38:55 | ChanServ | sets mode +o geekosaur |
| 19:38:55 | × | kayvan quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Remote host closed the connection) |
| 19:39:01 | geekosaur | sets mode +b kayvan!*@* |
| 19:39:13 | <johnjaye> | oh. i thought someone actually wanted to establish genuine human connection with me |
| 19:39:23 | <cheater> | same. sadge :( |
| 19:39:27 | <scav> | rookie mistake |
| 19:39:30 | geekosaur | sets mode -o geekosaur |
| 19:39:30 | ← | bookshelfdave parts (sid28102@2a03:5180:f:3::6dc6) () |
| 19:39:33 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 19:39:37 | <jean-paul[m]> | I will talk to you johnjaye |
| 19:39:38 | <jean-paul[m]> | Do you like haskell |
| 19:39:38 | <anatta> | this *is* the most genuine human connection I've had this week |
| 19:39:41 | <geekosaur> | of course they stopped and left as soon as I opped |
| 19:39:42 | <cheater> | geekosaur: what if it was a call for help |
| 19:39:53 | <johnjaye> | i like haskell. but i haven't really done a compiler in haskell. |
| 19:40:01 | <johnjaye> | i feel like to *really* get a language you have to make a compiler in it |
| 19:40:07 | <opqdonut> | ah, copypasting the channel member list |
| 19:40:10 | <opqdonut> | that takes me back |
| 19:40:10 | <cheater> | geekosaur: he stopped long before. he got throttled by the server. it's probably just someone who mis-pasted |
| 19:40:19 | <nomagno> | This MF can't even write me a whole custom sentence |
| 19:40:45 | <johnjaye> | i mean we're all doomed due to chatGPT anyway. there will be no way to determine who is and isn't a human |
| 19:41:01 | <anatta> | johnjaye: I don't know - I've made a compiler in Haskell, but I still don't understand anything |
| 19:41:05 | <kee> | johnjaye: Disregard that. Talk about lawnmowers. |
| 19:41:06 | <scav> | unless you bring up a subject from after 2021 :) |
| 19:41:09 | <hussam> | What? Who dares disturb my slumber? |
| 19:41:42 | <sayola> | gonna exchange private keys before ai takes over and hope we never lose them or we lose human credibility lol |
| 19:41:47 | <nomagno> | I don't even know why I'm on here, I barely understood Learn You a Haskell and promptly forgot to practice further |
| 19:41:53 | <anatta> | But then it was just for an extremely basic language and not anything serious |
| 19:42:13 | <defanor> | Exchanging private keys sounds like something ChatGPT would say! |
| 19:42:27 | <johnjaye> | oh yeah i forgot about public/private keys. that might be a potential avenue for proving your humanity |
| 19:42:42 | → | king_gs joins (~Thunderbi@187.201.41.239) |
| 19:42:46 | <johnjaye> | but i guess ultimately it has to be outside IRC because inside irc is only text, in which chatGPT reigns supreme. |
| 19:42:53 | <so-offish> | I didn't like Learn You a Haskell. Hopefully there are better recommendations in here... |
| 19:43:32 | <sayola> | i dunno. LYaH worked for me back then. it was somewhat overly wordy perhaps. |
| 19:43:33 | <johnjaye> | there's like 2 or 3 haskell tutorials. learn x in y minutes was one. i forgot the 3rd one |
| 19:43:33 | <anatta> | I hate lyah |
| 19:43:38 | <nomagno> | I just learned Scheme instead, helped me get to grips with FP better. I'm probably way more ready for Haskell now |
| 19:43:42 | <anatta> | I like haskell from first principle |
| 19:43:45 | <anatta> | or whatever it's called |
| 19:43:59 | <sayola> | i think it helps to know from what background you coming |
| 19:43:59 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 19:44:07 | <anatta> | but I think it's personal what style resonates the most with you |
| 19:44:40 | <anatta> | for me Lyah felt like a list of functions being thrown in my face, no exercises, etc. |
| 19:44:43 | <L29Ah> | johnjaye: just ask it what weighs more, a kilogram of feathers or a kilogram of steel |
| 19:44:47 | × | so-offish quits (~so-offish@2610:148:610:b66:21d9:e18a:fd7a:ab8) (Quit: Leaving) |
| 19:45:03 | <anatta> | I managed to mess chatGPT up today by asking about NFA:s and regular expressions |
| 19:45:19 | <Hecate> | hohai |
| 19:45:27 | <[exa]> | o/ |
| 19:45:31 | <Hecate> | too bad the bot didn't want to hear about my latest projects :( :( |
| 19:45:31 | <anatta> | I asked it to make an NFA out of a regex, and it gave me something competely wrong - I told it that it was wrong, and it gave me something else that was wrong |
| 19:45:36 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 248 seconds) |
| 19:45:36 | <nomagno> | anatta: oh hey, I need help with that! |
| 19:45:41 | <nomagno> | ... Now I know not to ask chatGPT |
| 19:45:55 | <[exa]> | anatta: I found that encoding any problem to a wording that's not common kinda causes it to lose much memory |
| 19:46:02 | <anatta> | then I asked it to show the path through the NFA with a certain string |
| 19:46:07 | <anatta> | it gave me a path to an accepting state |
| 19:46:13 | <anatta> | using transitions that weren't in the NFA |
| 19:46:15 | <[exa]> | nomagno: feel free in #-offtopic btw |
| 19:46:30 | <[exa]> | oh cool :D |
| 19:47:23 | <AndreasK> | ChatGPT seems to be like a student who memorized all the materials but understood none of it |
| 19:47:23 | <anatta> | yeah, it felt really weird, like it kept arguing it had correct answers despite the answers being obviously wrong |
| 19:48:06 | <darkling> | AndreasK: That's *exactly* how I read it most of the time. |
| 19:48:16 | × | kayvank quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Quit: ERC 5.4 (IRC client for GNU Emacs 28.1)) |
| 19:48:19 | <anatta> | it wasn't like... slightly wrong in some obscure way, what it was giving me just straight up didn't make any sense |
| 19:48:35 | <AndreasK> | That's my experience with that sort of stundent too at time :D |
| 19:48:43 | <byorgey> | AndreasK: as a teacher, I can confirm that is exactly what it is like =) |
| 19:48:51 | → | kayvank joins (~user@52-119-115-185.public.monkeybrains.net) |
| 19:48:54 | <geekosaur> | was goona say, sounds like it's about average for regex 🙂 |
| 19:49:09 | <[exa]> | someone should ask it about a maze-style problem or so |
| 19:49:17 | <AndreasK> | I think the bot is back |
| 19:49:19 | ChanServ | sets mode +o litharge |
| 19:49:19 | litharge | sets mode -bo kayvan!*@* litharge |
| 19:49:44 | <Hecate> | blanket k-line on monkeybrains.net ? |
| 19:49:46 | <Hecate> | :p |
| 19:49:52 | <tomsmeding> | I love how I actually see a bunch of nicks talking now that I've never seen before in the channel |
| 19:49:56 | <mikko> | hello kayvank i believe you had something you wanted to say to me? |
| 19:50:01 | <tomsmeding> | "ping the world" actually did something nice |
| 19:50:10 | <AndreasK> | :) |
| 19:50:18 | → | werneta joins (~werneta@137.79.219.74) |
| 19:50:26 | <[exa]> | tomsmeding: an absolute highlight of the evening |
| 19:51:15 | <AndreasK> | I'm sure in a few years people at the edge will figure out to loop tyoecheckers etc. into things like chatGTP and then it likely becomes a really good tool for churning out boring code |
| 19:51:20 | × | coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot) |
| 19:52:20 | <Hecate> | good evening tomsmeding |
| 19:52:29 | <Hecate> | so, how's your playground holding with all that Mastodon trafic? :p |
| 19:52:43 | <anatta> | AndreasK: It's also possible that knowing what it's good at and what it's bad at will become a useful skill in itself |
| 19:53:07 | <tomsmeding> | Hecate: honestly it's idling lol |
| 19:53:13 | <tomsmeding> | Hecate: https://play-haskell.tomsmeding.com/srv_static/usage_graph.png |
| 19:53:33 | <tomsmeding> | iirc every green pixel is a compile request, every red pixel is one second of worker cpu time |
| 19:53:34 | × | kayvank quits (~user@52-119-115-185.public.monkeybrains.net) (Client Quit) |
| 19:53:45 | <tomsmeding> | green covers red because I was too lazy to make a proper graph |
| 19:54:36 | <mauke> | what chatGPT is good at is generating plausible looking bullshit and presenting it with confidence |
| 19:54:52 | <tomsmeding> | which is actually useful for certain purposes |
| 19:54:55 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 19:54:58 | <tomsmeding> | the "looking plausible" bit |
| 19:55:20 | × | kayvank quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Client Quit) |
| 19:55:26 | <mauke> | yeah, but it's pretty much the opposite of what you want for software development |
| 19:55:32 | <tomsmeding> | yes |
| 19:55:46 | <johnjaye> | mauke: sounds like those top 10 articles you see in browsers are pretty much covered then |
| 19:55:49 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 19:56:26 | <johnjaye> | you'll never be able to get a good recipe for a pina colada again because all you'll get is something 'plausible' |
| 19:58:27 | <mikko> | mauke: but it's really great for when you only have a vague human language description of the thing you're looking for, and you just want some example so you can start looking at the actual docs |
| 19:58:35 | → | Feuermagier_ joins (~Feuermagi@user/feuermagier) |
| 19:58:52 | <mikko> | as long as you are aware of what NOT to use chatGPT for it's a really useful tool |
| 20:00:30 | <Hecate> | tomsmeding: hehe, nice |
| 20:00:55 | → | pernzs joins (~pernzs@101.175.168.100) |
| 20:01:08 | <jil> | geekosaur |
| 20:01:15 | × | Feuermagier quits (~Feuermagi@user/feuermagier) (Ping timeout: 248 seconds) |
| 20:01:42 | <jil> | geekosaur thank you for you message. |
| 20:02:21 | <tomsmeding> | Hecate: I lied, number of compile requests is foreground red, server-to-worker request time (~ worker cpu time) in seconds is background green |
| 20:02:28 | <anatta> | I'm just happy it's easily confused: https://i.imgur.com/K9qoVqB.png |
| 20:02:30 | <tomsmeding> | no |
| 20:02:40 | <tomsmeding> | _background_ red, _foreground_ green |
| 20:02:45 | <tomsmeding> | aah I'm tired I'm going to bed bye |
| 20:02:53 | <anatta> | So when the inevitable robot uprising occurs, and terminators come knocking at my door, I can just tell them I'm not at home, and they'll happily go away |
| 20:03:27 | <darkling> | anatta: Don't forget to wear the t-shirt reading "fridge". Just in case. |
| 20:04:47 | → | ajf___[m] joins (~ajfmatrix@2001:470:69fc:105::2:5be3) |
| 20:04:54 | <anatta> | many have said I could easily be confused for a fridge |
| 20:05:31 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 20:06:23 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 255 seconds) |
| 20:07:24 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 20:08:23 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) |
| 20:08:31 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 20:09:23 | → | califax joins (~califax@user/califx) |
| 20:12:59 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 248 seconds) |
| 20:16:06 | <[exa]> | there were the convolution-killing t-shirts somewhere on the internet, about time to buy some I guess |
| 20:16:52 | <hammond_> | lol |
| 20:16:55 | <hammond_> | omg |
| 20:18:31 | <[exa]> | ah here https://arxiv.org/pdf/1910.11099.pdf |
| 20:19:08 | <mauke> | https://www.lesswrong.com/posts/aPeJE8bSo6rAFoLqg/solidgoldmagikarp-plus-prompt-generation |
| 20:19:28 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 20:19:32 | × | pernzs quits (~pernzs@101.175.168.100) (Quit: Client closed) |
| 20:19:37 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 20:19:58 | <akegalj> | Hi, in this article https://simonmar.github.io/posts/2018-06-20-Finding-fixing-space-leaks.html simon is saying "To avoid this leak, we could pattern-match on pls eagerly rather than doing the lazy record selection". There is a broken link unfortunatelly so can't se the source. How to pattern match eagerly on a record? Would `case pls of LM {closure_env} -> ...` work in this case? |
| 20:20:33 | <[exa]> | mauke: ok wow |
| 20:22:41 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) (Remote host closed the connection) |
| 20:23:30 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 20:24:16 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 268 seconds) |
| 20:24:59 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 20:25:26 | <AndreasK> | akegalj: The commit in question is https://github.com/ghc/ghc/commit/71f6b18ba365da9ee4795f6cbce6ec9f1bfe95e8 if that helps |
| 20:25:27 | → | pernzs joins (~pernzs@101.175.168.100) |
| 20:27:08 | <AndreasK> | I think your pattern match should work too |
| 20:27:23 | × | king_gs quits (~Thunderbi@187.201.41.239) (Ping timeout: 248 seconds) |
| 20:28:51 | × | biberu quits (~biberu@user/biberu) (Read error: Connection reset by peer) |
| 20:29:36 | → | eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) |
| 20:34:01 | → | codaraxis__ joins (~codaraxis@user/codaraxis) |
| 20:34:10 | <akegalj> | AndreasK: thanks |
| 20:34:42 | → | biberu joins (~biberu@user/biberu) |
| 20:38:03 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 248 seconds) |
| 20:38:03 | × | codaraxis quits (~codaraxis@user/codaraxis) (Ping timeout: 248 seconds) |
| 20:38:47 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 20:40:55 | × | sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Ping timeout: 260 seconds) |
| 20:42:19 | → | waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) |
| 20:42:51 | <carter> | That solid gold magikarp bit is nuts |
| 20:43:08 | <ongy[m]> | :( I thought someone wanted to talk to me |
| 20:49:57 | → | kurbus joins (~kurbus@user/kurbus) |
| 20:50:36 | <akegalj> | AndreasK: In the fix you linked above, if L174 was defined as `let new_ce = extendClosureEnv (closure_env pls) new_bindings` would it still leak? (if he didn't pattern match on L173) |
| 20:53:17 | <akegalj> | also, would just doing `let !new_ce = extendClosureEnv (closure_env pls) new_bindings` resolve the leak (without forcing at the end with `return $! ...`) |
| 20:57:35 | × | kurbus quits (~kurbus@user/kurbus) (Quit: Client closed) |
| 21:00:51 | × | jonathanx quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 255 seconds) |
| 21:05:07 | <AndreasK> | If `let !new_ce = extendClosureEnv (closure_env pls) new_binding` leaks should depend on the implementation of extendClosureEnv |
| 21:05:34 | <AndreasK> | If extendClosureEnv forces the first argument that should be fine |
| 21:11:27 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds) |
| 21:11:38 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 255 seconds) |
| 21:17:33 | × | pernzs quits (~pernzs@101.175.168.100) (Ping timeout: 260 seconds) |
| 21:19:46 | <ddellacosta> | is there a way to pass test-options to cabal in a nix flake? I'm trying to pass a filter to tasty |
| 21:20:24 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 21:20:31 | → | pernzs joins (~pernzs@101.175.168.100) |
| 21:21:28 | <akegalj> | ok, that makes sense. Although, I am not yet clear how `return $! pls {...}` is necessary as it will be forced only to its whnf, so it won't force any of record fields... Aha, I guess $! will force record update and release `pls` binding from record update (`pls {...}`). I wonder if the same would work if we used different syntax `return $! ConstructorName { field1 = fielf1 pls, field2 = field2 pls, ...} |
| 21:21:34 | <akegalj> | . My intuition was that $! would force only to whnf so it wouldn't force constructor/record fields |
| 21:22:26 | → | pavonia joins (~user@user/siracusa) |
| 21:23:44 | → | freeside joins (~mengwong@103.252.202.170) |
| 21:27:39 | × | zeenk quits (~zeenk@2a02:2f04:a214:1e00::7fe) (Quit: Konversation terminated!) |
| 21:28:17 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 255 seconds) |
| 21:29:00 | × | zer0bitz quits (~zer0bitz@2001:2003:f443:d600:d5e7:46b7:b251:b47a) (Read error: Connection reset by peer) |
| 21:31:06 | × | lyle quits (~lyle@104.246.145.85) (Quit: WeeChat 3.8) |
| 21:31:22 | → | zer0bitz joins (~zer0bitz@2001:2003:f443:d600:59df:db32:bf45:bad2) |
| 21:32:26 | × | takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
| 21:33:15 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 21:34:24 | × | zer0bitz quits (~zer0bitz@2001:2003:f443:d600:59df:db32:bf45:bad2) (Read error: Connection reset by peer) |
| 21:36:33 | → | dsrt^ joins (~dsrt@c-24-30-76-89.hsd1.ga.comcast.net) |
| 21:39:10 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 21:41:33 | → | sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) |
| 21:41:39 | → | zer0bitz joins (~zer0bitz@2001:2003:f443:d600:7cbf:c51:a17d:df99) |
| 21:42:48 | × | kayvank quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Remote host closed the connection) |
| 21:43:24 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 21:45:21 | → | eruditass joins (uid248673@id-248673.uxbridge.irccloud.com) |
| 21:45:54 | → | freeside joins (~mengwong@103.252.202.170) |
| 21:46:27 | × | bgs quits (~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection) |
| 21:47:29 | × | sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Read error: Connection reset by peer) |
| 21:48:13 | → | sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) |
| 21:48:44 | → | emmanuelux joins (~emmanuelu@user/emmanuelux) |
| 21:50:53 | × | zer0bitz quits (~zer0bitz@2001:2003:f443:d600:7cbf:c51:a17d:df99) (Read error: Connection reset by peer) |
| 21:51:49 | × | _leo___ quits (~emmanuelu@user/emmanuelux) (Ping timeout: 252 seconds) |
| 21:52:07 | × | kayvank quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Quit: ERC 5.4 (IRC client for GNU Emacs 28.1)) |
| 21:52:38 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 21:53:12 | × | kayvank quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Remote host closed the connection) |
| 21:53:29 | × | eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
| 21:53:37 | → | kayvank joins (~user@52-119-115-185.PUBLIC.monkeybrains.net) |
| 22:00:08 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 22:00:27 | → | gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) |
| 22:02:28 | × | pernzs quits (~pernzs@101.175.168.100) (Ping timeout: 260 seconds) |
| 22:03:43 | × | notzmv quits (~zmv@user/notzmv) (Remote host closed the connection) |
| 22:04:49 | × | leahclarm quits (~leahclarm@91.110.109.171) (Remote host closed the connection) |
| 22:05:04 | → | coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) |
| 22:06:10 | → | leahclarm joins (~leahclarm@91.110.109.171) |
| 22:06:19 | × | leahclarm quits (~leahclarm@91.110.109.171) (Client Quit) |
| 22:07:33 | → | chexum_ joins (~quassel@gateway/tor-sasl/chexum) |
| 22:08:26 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 255 seconds) |
| 22:09:06 | × | thegeekinside quits (~thegeekin@189.180.83.186) (Ping timeout: 268 seconds) |
| 22:09:45 | <AndreasK> | akegalj: I had assumed it's a strict field but doesn't seem to be so it's a bit tricker |
| 22:10:30 | × | michalz quits (~michalz@185.246.204.101) (Remote host closed the connection) |
| 22:11:50 | <AndreasK> | Per the report foo { bar = baz} get's desugared to `case foo of Con fld1 ... fldn -> Con { fld1 = fld1, ... , bar = bar,... fldn = fldn } |
| 22:12:34 | <AndreasK> | So that means we fore the deconstruction of old ps, allowing us to gc the old value of the closure_env value immediately. |
| 22:16:00 | × | segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Ping timeout: 248 seconds) |
| 22:20:55 | <AndreasK> | They key take away is that record updates are desugared to one case projecting out all the fields and reconstructing the constructor(s) in the alternative. Rather then being desugared to a constructor allocation and a lot of field selector applications. In the later case the bang wouldn't do anything. |
| 22:20:58 | × | waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 252 seconds) |
| 22:22:56 | × | mc47 quits (~mc47@xmonad/TheMC47) (Remote host closed the connection) |
| 22:23:02 | <akegalj> | ok that makes now. If record update is desugared as case split, then I think $! in his case isn't necessary as case will eagarly evaluate. So I think `return (pls {..})` should work the same. `return $! pls {..}` looks nicer, but here we are using extra `seq` on already evaluated form (case expression) ... and that might be unnecessary (and maybe slower?) |
| 22:24:25 | <akegalj> | in anyway, thanks for guidance - my mind is in peace now |
| 22:26:54 | → | thegeekinside joins (~thegeekin@189.180.83.186) |
| 22:28:58 | × | Batzy quits (~quassel@user/batzy) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.) |
| 22:30:12 | → | Batzy joins (~quassel@user/batzy) |
| 22:32:22 | → | Guest|4 joins (~Guest|4@ip-86-49-241-234.bb.vodafone.cz) |
| 22:32:49 | × | Guest|4 quits (~Guest|4@ip-86-49-241-234.bb.vodafone.cz) (Client Quit) |
| 22:35:19 | × | mcglk quits (~mcglk@131.191.49.120) (Read error: Connection reset by peer) |
| 22:36:27 | × | johnjaye quits (~pi@173.209.64.74) (Ping timeout: 248 seconds) |
| 22:36:51 | → | notzmv joins (~zmv@user/notzmv) |
| 22:38:26 | → | johnjaye joins (~pi@173.209.64.74) |
| 22:38:36 | <mauke> | return doesn't force its argument, so why would $! be redundant? |
| 22:39:35 | <AndreasK> | Whaut mauke said + case expressions are not evaluated forms. |
| 22:40:01 | <AndreasK> | Well I guess technically it depends on the exact case, but ususally they aren't |
| 22:40:43 | <akegalj> | right, so pls might be a thunk and it is evaluated with $! |
| 22:43:29 | → | segfaultfizzbuzz joins (~segfaultf@108.211.201.53) |
| 22:44:48 | → | mcglk joins (~mcglk@131.191.49.120) |
| 22:50:48 | → | opticblast joins (~Thunderbi@172.58.82.191) |
| 22:51:55 | × | mechap quits (~mechap@user/mechap) (Ping timeout: 248 seconds) |
| 22:53:09 | → | waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) |
| 22:53:48 | → | mechap joins (~mechap@user/mechap) |
| 22:54:00 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) |
| 22:54:35 | × | freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds) |
| 22:58:17 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) (Ping timeout: 255 seconds) |
| 23:01:14 | × | mechap quits (~mechap@user/mechap) (Quit: WeeChat 3.8) |
| 23:01:23 | → | Intel8086 joins (~Intel8086@user/Intel8086) |
| 23:01:43 | × | coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot) |
| 23:01:53 | → | patrl joins (~patrl@user/patrl) |
| 23:04:11 | × | L29Ah quits (~L29Ah@wikipedia/L29Ah) (Ping timeout: 248 seconds) |
| 23:04:26 | × | gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.8) |
| 23:04:31 | × | patrl quits (~patrl@user/patrl) (Client Quit) |
| 23:05:32 | → | freeside joins (~mengwong@103.252.202.170) |
| 23:05:45 | × | Ranhir quits (~Ranhir@157.97.53.139) (Remote host closed the connection) |
| 23:06:17 | <johnjaye> | is there something like foldl that can generate the elements of a list |
| 23:06:35 | <johnjaye> | like if i want to use a rule like i-> i + 1 to make a list of numbers 1 to 10 |
| 23:06:57 | <Rembane> | johnjaye: iterate from Data.List could do almost that. |
| 23:07:17 | <Rembane> | > [1..10] -- but also this, johnjaye |
| 23:07:19 | <lambdabot> | [1,2,3,4,5,6,7,8,9,10] |
| 23:07:33 | <geekosaur> | :t unfoldr |
| 23:07:35 | <johnjaye> | right but i mean something like [2*i for i in range(10)] from python |
| 23:07:35 | <lambdabot> | error: |
| 23:07:35 | <lambdabot> | Ambiguous occurrence ‘unfoldr’ |
| 23:07:35 | <lambdabot> | It could refer to |
| 23:07:44 | <geekosaur> | :t Prelude.unfoldr |
| 23:07:45 | <lambdabot> | error: |
| 23:07:45 | <lambdabot> | Not in scope: ‘Prelude.unfoldr’ |
| 23:07:45 | <lambdabot> | Perhaps you meant one of these: |
| 23:08:06 | → | Ranhir joins (~Ranhir@157.97.53.139) |
| 23:08:30 | <AndreasK> | > [2*i | i <- 1 .. 10] |
| 23:08:32 | <lambdabot> | <hint>:1:15: error: parse error on input ‘..’ |
| 23:08:39 | <AndreasK> | > [2*i | i <- [1 .. 10]] |
| 23:08:40 | <lambdabot> | [2,4,6,8,10,12,14,16,18,20] |
| 23:08:44 | <mauke> | :t scanl |
| 23:08:44 | <lambdabot> | error: |
| 23:08:44 | <lambdabot> | Ambiguous occurrence ‘scanl’ |
| 23:08:44 | <lambdabot> | It could refer to |
| 23:09:08 | <geekosaur> | looks like it moved and renamed |
| 23:09:10 | <Rembane> | It's so ambigious that lambdabot doesn't know what it could refer to... |
| 23:09:12 | <geekosaur> | :t unfold |
| 23:09:13 | <lambdabot> | (a -> (b, Maybe a)) -> a -> NonEmpty b |
| 23:12:08 | × | __monty__ quits (~toonn@user/toonn) (Quit: leaving) |
| 23:16:35 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:9525:b972:bf3b:9db0) |
| 23:20:47 | <jackdk> | :t Data.List.scanl |
| 23:20:48 | <lambdabot> | (b -> a -> b) -> b -> [a] -> [b] |
| 23:21:26 | → | dudek joins (~dudek@185.150.236.131) |
| 23:25:39 | → | king_gs joins (~Thunderbi@187.201.41.239) |
| 23:32:06 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 23:34:43 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 23:37:28 | × | akegalj quits (~akegalj@37-128.dsl.iskon.hr) (Quit: leaving) |
| 23:38:48 | × | dudek quits (~dudek@185.150.236.131) (Quit: Leaving) |
| 23:42:55 | × | kayvank quits (~user@52-119-115-185.PUBLIC.monkeybrains.net) (Ping timeout: 248 seconds) |
| 23:44:38 | × | crns quits (~netcrns@user/crns) (Ping timeout: 255 seconds) |
| 23:50:21 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 23:50:54 | → | accord joins (uid568320@2a03:5180:f:4::8:ac00) |
| 23:54:35 | → | falafel joins (~falafel@2607:fb91:143f:e47f:7c10:9e2f:b315:833b) |
| 23:55:10 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 268 seconds) |
All times are in UTC on 2023-02-08.