Home liberachat/#haskell: Logs Calendar

Logs on 2023-01-31 (liberachat/#haskell)

00:02:18 Inst joins (~Inst@2601:6c4:4081:54f0:891d:3999:8b1d:922e)
00:02:19 <jackdk> An interesting consequence of that claim is that many programming languages with large user bases are in fact not practical
00:02:21 <Inst> I still think it's sort of funny
00:02:41 <Inst> that OOP is incidentally evolving closer to FP; i.e, "inheritance was a bad idea, composition is better"
00:03:17 × Tuplanolla quits (~Tuplanoll@91-159-68-152.elisa-laajakaista.fi) (Quit: Leaving.)
00:03:49 <monochrom> Well, "honest mistakes" is broad and vague. You have to decide where to draw the line. Different designers draw different lines and assume different skill levels of programmers. So some languages are more lax than others.
00:04:17 <geekosaur> jackdk, I'd say (a) they often evolve such mechanisms as they discover the need for them the hard way (b) their definitions of "guard against" and "discourage" may differ from ours
00:05:00 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
00:05:01 <jackdk> I'm thinking about misfeatures like "I'm allowed to reassign `final` variables but you're not"; "I'm allowed to define a built-in enumerated type but you're not"; "I'm allowed to do ad-hoc polymorphism but you're not", to pick a few examples off the top of my head
00:05:18 <segfaultfizzbuzz> i mean if you are expanding to include all the libraries for a language, supply chain attacks are a very real thing,...
00:05:44 <monochrom> Oh heh, nobody is perfect, even by said nobody's personal standard. :)
00:08:02 × arkeet quits (arkeet@moriya.ca) (Quit: ZNC 1.8.2 - https://znc.in)
00:08:13 arkeet joins (~arkeet@moriya.ca)
00:09:27 × thongpv quits (~thongpv87@14.179.159.25) (Ping timeout: 252 seconds)
00:11:17 × segfaultfizzbuzz quits (~segfaultf@108.211.201.53) (Quit: segfaultfizzbuzz)
00:11:20 × kee quits (~~kee@user/wizzwizz4) (Ping timeout: 268 seconds)
00:11:21 × werneta quits (~werneta@137.79.207.195) (Remote host closed the connection)
00:13:34 × [Leary] quits (~Leary]@user/Leary/x-0910699) (Remote host closed the connection)
00:14:09 [Leary] joins (~Leary]@user/Leary/x-0910699)
00:18:45 danza joins (~francesco@151.44.209.120)
00:19:29 ph88 joins (~ph88@2a02:8109:9e00:71d0:dd:6cfd:8537:67c6)
00:37:19 × danza quits (~francesco@151.44.209.120) (Read error: Connection reset by peer)
00:38:35 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 264 seconds)
00:39:48 thongpv joins (~thongpv87@14.179.159.25)
00:40:04 × ph88 quits (~ph88@2a02:8109:9e00:71d0:dd:6cfd:8537:67c6) (Quit: Leaving)
00:40:32 ph88 joins (~ph88@2a02:8109:9e00:71d0:760c:b1ba:cea2:4498)
00:43:41 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
00:44:17 × acidjnk quits (~acidjnk@p200300d6e715c47228ee5485b7272aa0.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
00:44:56 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
00:44:58 × zeenk quits (~zeenk@2a02:2f04:a014:8700::7fe) (Quit: Konversation terminated!)
00:46:15 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
00:46:15 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
00:46:15 wroathe joins (~wroathe@user/wroathe)
00:47:48 × ph88 quits (~ph88@2a02:8109:9e00:71d0:760c:b1ba:cea2:4498) (Quit: Leaving)
00:50:53 × opticblast quits (~Thunderbi@172.58.84.5) (Quit: opticblast)
00:51:10 opticblast joins (~Thunderbi@172.58.84.5)
00:52:31 danza joins (~francesco@151.44.217.224)
00:52:35 × opticblast quits (~Thunderbi@172.58.84.5) (Read error: Connection reset by peer)
00:52:53 opticblast joins (~Thunderbi@172.58.82.233)
00:54:28 beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
00:59:39 × opticblast quits (~Thunderbi@172.58.82.233) (Ping timeout: 260 seconds)
01:16:47 kee joins (~~kee@user/wizzwizz4)
01:18:30 troydm joins (~troydm@user/troydm)
01:18:57 × slack1256 quits (~slack1256@181.42.52.81) (Remote host closed the connection)
01:23:26 Guest75 joins (~Guest75@178.141.149.12)
01:37:36 × xff0x quits (~xff0x@ai081074.d.east.v6connect.net) (Ping timeout: 248 seconds)
01:39:51 <Hammdist> how do I do optmap in haskell?
01:39:55 werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
01:40:36 <monochrom> What is optmap?
01:41:37 <Hammdist> map f o is None if o is None and Some (f v) if o is Some v.
01:41:51 <jackdk> > fmap (+3) (Just 4)
01:41:53 <lambdabot> Just 7
01:42:02 <jackdk> > (+3) <$> Nothing
01:42:05 <lambdabot> Nothing
01:42:23 <Hammdist> ah fmap. ok thanks
01:42:31 <jackdk> (`<$>` is an infix alias for `fmap`, because it looks like `$` with wings)
01:42:45 <jackdk> % :t fmap
01:42:45 <yahb2> fmap :: Functor f => (a -> b) -> f a -> f b
01:42:50 <jackdk> % :t fmap @Maybe
01:42:50 <yahb2> fmap @Maybe :: (a -> b) -> Maybe a -> Maybe b
01:50:31 <dsal> Do the wings provide lift?
01:50:41 <yushyin> lol
01:53:06 Reinhilde is now known as AmyMalik
02:16:00 × Feuermagier quits (~Feuermagi@user/feuermagier) (Read error: Connection reset by peer)
02:16:03 Feuermagier_ joins (~Feuermagi@user/feuermagier)
02:18:44 thongpv87 joins (~thongpv87@14.179.159.25)
02:21:19 × thongpv quits (~thongpv87@14.179.159.25) (Ping timeout: 248 seconds)
02:22:55 xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
02:23:17 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 252 seconds)
02:23:28 × telser quits (~quassel@user/telser) (Ping timeout: 248 seconds)
02:24:29 telser joins (~quassel@user/telser)
02:26:22 × yrlnry quits (~yrlnry@pool-108-36-173-41.phlapa.fios.verizon.net) (Read error: Connection reset by peer)
02:26:23 × phma quits (phma@2001:5b0:212a:9278:328d:f1cd:3dee:19c5) (Read error: Connection reset by peer)
02:27:29 yrlnry joins (~yrlnry@2600:4040:738e:5400:14e9:d2e1:808a:60f2)
02:27:43 whatsupdoc joins (uid509081@id-509081.hampstead.irccloud.com)
02:27:49 phma joins (~phma@2001:5b0:212a:9278:328d:f1cd:3dee:19c5)
02:28:53 × use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) (Remote host closed the connection)
02:29:12 use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf)
02:34:49 × phma quits (~phma@2001:5b0:212a:9278:328d:f1cd:3dee:19c5) (Remote host closed the connection)
02:35:09 merijn joins (~merijn@86.86.29.250)
02:37:04 × beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Ping timeout: 260 seconds)
02:40:23 phma joins (~phma@host-67-44-208-111.hnremote.net)
02:43:35 califax_ joins (~califax@user/califx)
02:43:50 × califax quits (~califax@user/califx) (Ping timeout: 255 seconds)
02:44:11 × Feuermagier_ quits (~Feuermagi@user/feuermagier) (Ping timeout: 252 seconds)
02:44:11 × thegeekinside quits (~thegeekin@189.180.66.244) (Remote host closed the connection)
02:44:52 califax_ is now known as califax
02:51:27 <EvanR> this is funny, went looking for what generics magic pretty-simple uses for pretty printing anything with a Show instance
02:52:01 michael_ joins (~michael@2601:182:d17f:4a10:56e4:7b90:1599:5f77)
02:52:02 <EvanR> it seems to parse the output of show into some kind of expression, then goes through and format and colors the expression
02:52:17 <EvanR> it's stringly typed
02:52:39 <monochrom> I think it doesn't. I think it parses standard Show outcomes back to an approximate grammar and then reformats.
02:52:46 <monochrom> Yes.
02:58:48 eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
03:01:25 × sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Ping timeout: 252 seconds)
03:02:06 sammelweis joins (~quassel@mobile-107-92-121-168.mycingular.net)
03:04:32 × michael_ quits (~michael@2601:182:d17f:4a10:56e4:7b90:1599:5f77) (Ping timeout: 248 seconds)
03:06:46 Feuermagier joins (~Feuermagi@user/feuermagier)
03:07:39 × Feuermagier quits (~Feuermagi@user/feuermagier) (Max SendQ exceeded)
03:09:08 Feuermagier joins (~Feuermagi@user/feuermagier)
03:09:29 × merijn quits (~merijn@86.86.29.250) (Ping timeout: 252 seconds)
03:13:04 × td_ quits (~td@i53870926.versanet.de) (Ping timeout: 248 seconds)
03:14:10 thegeekinside joins (~thegeekin@189.180.66.244)
03:14:39 td_ joins (~td@i53870908.versanet.de)
03:28:14 × jargon quits (~jargon@184.101.182.107) (Remote host closed the connection)
03:28:26 × forell quits (~forell@user/forell) (Ping timeout: 246 seconds)
03:31:45 forell joins (~forell@user/forell)
03:32:27 × danza quits (~francesco@151.44.217.224) (Read error: Connection reset by peer)
03:33:52 × codaraxis quits (~codaraxis@user/codaraxis) (Ping timeout: 248 seconds)
03:34:03 × Feuermagier quits (~Feuermagi@user/feuermagier) (Ping timeout: 252 seconds)
03:36:41 × forell quits (~forell@user/forell) (Ping timeout: 268 seconds)
03:37:30 × thongpv87 quits (~thongpv87@14.179.159.25) (Ping timeout: 260 seconds)
03:37:33 Feuermagier joins (~Feuermagi@user/feuermagier)
03:39:16 forell joins (~forell@user/forell)
03:40:23 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
03:40:23 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
03:40:23 finn_elija is now known as FinnElija
04:01:13 × off^ quits (~tj99@c-24-30-76-89.hsd1.ga.comcast.net) (Remote host closed the connection)
04:02:27 Feuermagier_ joins (~Feuermagi@user/feuermagier)
04:03:24 × Feuermagier quits (~Feuermagi@user/feuermagier) (Ping timeout: 255 seconds)
04:03:38 × Guest75 quits (~Guest75@178.141.149.12) (Ping timeout: 260 seconds)
04:04:07 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 252 seconds)
04:05:36 × sammelweis quits (~quassel@mobile-107-92-121-168.mycingular.net) (Read error: Connection reset by peer)
04:09:05 <EvanR> in Wai you have this response constructor called responseFile which takes a status code and file path of the file to serve. The System.IO routines seem to be geared towards try to open a file and catch exceptions if it doesn't exist, rather than testing for existence
04:09:40 sammelweis joins (~quassel@c-68-48-18-140.hsd1.mi.comcast.net)
04:10:01 <EvanR> how do you know to use 200 or 404 xD
04:10:27 <EvanR> try opening it then immediately close?
04:12:23 <jackdk> A file could be removed between the existence test and opening it for reading, so just opening it and handling errors seems like good behaviour to me?
04:14:01 <monochrom> I think the intention of responseFile is: You already know that the file path exists, hell you probably created it yourself, and its content is appropriate for 200 or 404 depending on the URL you received, which you decided separately whether that URL deserves a 202 or a 404.
04:14:54 <monochrom> In other words in general "http://mycom.com/foo" does not always means responseFile ??? "foo"
04:14:56 <mauke> https://hackage.haskell.org/package/directory-1.3.8.0/docs/System-Directory.html#v:doesFileExist
04:16:15 <monochrom> Instead you do your "routing" to decide whether "foo" makes sense or not. If yes, responseFile 200 "internal-filename-for-foo"; if not, responseFile 404 "internal-filename-for-404-cases".
04:17:02 <EvanR> it seems like the right thing would be to try to open the file, if success, begin the 200 and dumping of the file (and hope for the best after this). If it fails possibly 404. But this responseFile doesn't seem to work like that
04:17:39 <EvanR> (all assuming this path might go to a file based on the path prefix)
04:17:46 <monochrom> In case you really like to simplify it so that s/internal-filename-for-foo/foo, just use doesFileExist and don't overthink it. Yes there is a race condition, so control your computer to render that race condition impossible.
04:19:00 <monochrom> But in general web libraries are designed to deviate from "web server = file server".
04:19:58 <monochrom> The whole point of "web apps" and all the dynamism mutability it entails.
04:20:22 <monochrom> URLs are no longer referentially transparent since 2000.
04:21:06 <EvanR> responseFile does seems great if you "know" the file exists
04:21:24 <EvanR> doesFileExist it is
04:22:18 <monochrom> Is there a responseByteString? responseText? That would be much better for more use cases.
04:22:58 <EvanR> responseLBS takes a lazy ByteString
04:23:15 <monochrom> Less race condition if you're merely writing a file server. And exactly right if you're writing an actually dynamic webapp.
04:23:45 <EvanR> are you talking about lazy I/O
04:23:59 <EvanR> shocking
04:24:42 <monochrom> Yeah with that you openFIle/openBinaryFile, if no exception then hGetContents >>= responseLBS 200, if exception then responseLBS 404 "your usual 404 page content here"
04:25:18 <monochrom> which feels better than doesFileExist.
04:25:43 <monochrom> OTOH I don't think it really matters in most cases. Who is going to delete that file behind your back? Your dog?
04:25:54 <monochrom> "My dog ate my homework"
04:26:14 <EvanR> hypothetically the DELETE http verb xD
04:26:51 <EvanR> more realistically, PUT is going to modify this file
04:27:00 <EvanR> race conditions everywhere
04:27:08 varoo joins (~varoo@122.161.91.19)
04:27:49 × varoo quits (~varoo@122.161.91.19) (Client Quit)
04:28:04 <monochrom> So I guess this is why a select loop is preferred to multi-threading. A select loop enforces serializable consistency by brute. >:)
04:28:39 <monochrom> You complete one DELETE/PUT before you worry about a GET. Either that, or the GET is already finished before you see a DELETE?PUT.
04:28:48 varoo joins (~varoo@122.161.91.19)
04:29:59 <monochrom> high latency high backlog highest consistency ever
04:30:06 <EvanR> you have an infinite number of MVars one for each possible filename. Before doing a request take from the one corresponding to that filename and put it back after
04:30:29 <monochrom> hee hee
04:30:53 <monochrom> Perhaps add unsafeInterleaveIO to create those MVars lazily...
04:31:25 <EvanR> that's a sick idea
04:32:02 razetime joins (~Thunderbi@43.254.111.18)
04:32:58 <EvanR> fine, it's an STM bag of filenames. The taking from mvar is implemented as putting a filename in the bag or retrying if it's already there
04:38:23 × razetime quits (~Thunderbi@43.254.111.18) (Ping timeout: 248 seconds)
04:43:30 thongpv87 joins (~thongpv87@14.179.159.25)
04:43:33 × varoo quits (~varoo@122.161.91.19) (Quit: Internet messed up)
04:47:53 varoo joins (~varoo@122.161.91.19)
04:56:05 × biberu quits (~biberu@user/biberu) (Read error: Connection reset by peer)
04:57:14 × thongpv87 quits (~thongpv87@14.179.159.25) (Remote host closed the connection)
04:58:22 thongpv joins (~thongpv87@14.179.159.25)
04:58:57 biberu joins (~biberu@user/biberu)
05:03:19 Lycurgus joins (~juan@user/Lycurgus)
05:03:59 × thongpv quits (~thongpv87@14.179.159.25) (Ping timeout: 248 seconds)
05:05:32 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
05:11:17 × Maxdamantus quits (~Maxdamant@user/maxdamantus) (Ping timeout: 246 seconds)
05:12:11 Maxdamantus joins (~Maxdamant@user/maxdamantus)
05:14:34 × myxokeph quits (~myxokeph@cpe-65-28-251-121.cinci.res.rr.com) (Ping timeout: 260 seconds)
05:15:26 <Hammdist> I am interacting with GHC core library. Expr leads to Type. how do I access the TyVarTy case of Type? Not in scope: data constructor ‘TyVarTy’
05:20:24 × thegeekinside quits (~thegeekin@189.180.66.244) (Ping timeout: 260 seconds)
05:22:54 myxokeph joins (~myxokeph@cpe-65-28-251-121.cinci.res.rr.com)
05:28:47 × Feuermagier_ quits (~Feuermagi@user/feuermagier) (Quit: Leaving)
05:28:59 Feuermagier joins (~Feuermagi@user/feuermagier)
05:30:09 thongpv joins (~thongpv87@14.179.159.25)
05:32:09 × Lycurgus quits (~juan@user/Lycurgus) (Quit: Exeunt: personae.ai-integration.biz)
05:33:49 thegeekinside joins (~thegeekin@189.180.66.244)
05:33:51 × sayola quits (~sayola@ipservice-092-213-087-211.092.213.pools.vodafone-ip.de) (Read error: Connection reset by peer)
05:34:10 sayola joins (~sayola@ipservice-092-213-087-211.092.213.pools.vodafone-ip.de)
05:35:19 × Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
05:40:14 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 260 seconds)
05:43:12 danza joins (~francesco@151.35.11.63)
05:43:28 × jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 248 seconds)
05:46:40 × bontaq quits (~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 248 seconds)
05:48:05 Inst_ joins (~Inst@2601:6c4:4081:54f0:88ac:5549:dc57:9767)
05:50:35 × waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 248 seconds)
05:51:19 × freeside quits (~mengwong@103.252.202.170) (Ping timeout: 260 seconds)
05:51:59 × Inst quits (~Inst@2601:6c4:4081:54f0:891d:3999:8b1d:922e) (Ping timeout: 248 seconds)
05:52:27 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
05:58:14 trev joins (~trev@user/trev)
05:59:23 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
05:59:23 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
05:59:23 wroathe joins (~wroathe@user/wroathe)
06:03:49 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
06:04:12 jakalx joins (~jakalx@base.jakalx.net)
06:11:49 codaraxis joins (~codaraxis@user/codaraxis)
06:19:47 tromp joins (~textual@92.110.219.57)
06:26:39 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 248 seconds)
06:27:50 × thongpv quits (~thongpv87@14.179.159.25) (Ping timeout: 260 seconds)
06:29:15 takuan joins (~takuan@178-116-218-225.access.telenet.be)
06:31:08 michalz joins (~michalz@185.246.207.221)
06:47:45 razetime joins (~Thunderbi@117.193.3.163)
06:57:38 freeside joins (~mengwong@122.11.248.245)
07:04:18 kenran` joins (~user@user/kenran)
07:05:25 × tromp quits (~textual@92.110.219.57) (Quit: My iMac has gone to sleep. ZZZzzz…)
07:07:36 phma_ joins (phma@2001:5b0:212a:9278:328d:f1cd:3dee:19c5)
07:08:08 kassouni joins (~textual@2601:646:400:68b0:18dc:d2:c373:8213)
07:10:39 × phma quits (~phma@host-67-44-208-111.hnremote.net) (Ping timeout: 260 seconds)
07:14:14 codaraxis__ joins (~codaraxis@user/codaraxis)
07:15:17 freeside_ joins (~mengwong@202.161.55.11)
07:15:36 × troydm quits (~troydm@user/troydm) (Ping timeout: 268 seconds)
07:15:51 × kassouni quits (~textual@2601:646:400:68b0:18dc:d2:c373:8213) (Quit: Textual IRC Client: www.textualapp.com)
07:17:21 × freeside quits (~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
07:17:48 × codaraxis quits (~codaraxis@user/codaraxis) (Ping timeout: 255 seconds)
07:20:52 xeelad joins (~xeelad@pool-151-202-46-37.nycmny.fios.verizon.net)
07:21:29 phma_ is now known as phma
07:29:16 ddellacosta joins (~ddellacos@89.45.224.176)
07:30:52 lortabac joins (~lortabac@2a01:e0a:541:b8f0:49d:d667:4c42:a171)
07:36:04 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
07:41:13 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
07:46:49 × razetime quits (~Thunderbi@117.193.3.163) (Ping timeout: 260 seconds)
07:50:03 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
07:50:21 × shriekingnoise quits (~shrieking@186.137.175.87) (Ping timeout: 252 seconds)
07:54:23 × codaraxis__ quits (~codaraxis@user/codaraxis) (Ping timeout: 252 seconds)
07:56:29 gensyst joins (gensyst@user/gensyst)
07:57:05 <gensyst> How can I do something like class HasQuality e; getQuality :: e -> q ?
07:57:27 <gensyst> Basically each e that has an HasQuality instance, must also have some associated q type to it
07:57:35 <gensyst> How to get the q in there?
07:58:47 <gensyst> This code as such compiles fine: class HasQuality e where getQuality :: e -> q
08:00:51 razetime joins (~Thunderbi@117.193.3.163)
08:01:15 mmhat joins (~mmh@p200300f1c707be48ee086bfffe095315.dip0.t-ipconnect.de)
08:07:42 <gensyst> One moment let me start from scratch.
08:12:18 gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
08:15:50 <jackdk> I would generally not do this thing because you're either going to have bad type inference or only be able to associate one q with each e; however it is achievable using multiparam type classes (and a functional dependency e -> q) or an associated type (enabled by `-XTypeFamilies`)
08:17:42 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
08:19:48 × ft quits (~ft@p4fc2a257.dip0.t-ipconnect.de) (Quit: leaving)
08:21:16 kuttenbrunzer joins (~kuttenbru@2a02:8108:8b80:1d48:399d:ce45:6432:bc43)
08:22:01 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
08:22:30 <gensyst> jackdk,
08:22:41 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
08:22:46 <gensyst> Here is a concrete example: https://dpaste.com/6PEG4HSPC
08:23:07 <gensyst> If you "wouldn't do this", what's the alternative?
08:23:27 × danza quits (~francesco@151.35.11.63) (Ping timeout: 248 seconds)
08:23:45 <jackdk> An additional function argument to your computation
08:24:28 <gensyst> jackdk, and scrape the type class altogether?
08:24:42 <jackdk> Yeah
08:25:13 <gensyst> lol
08:25:28 <gensyst> why does it always end up being simple... why do i always overcomplicate things in my head
08:25:41 <gensyst> it's interesting how much is achievable just with "simple haskell"
08:26:05 <jackdk> I shipped a change at work late last year that was net -1000 LoC or so with no relevant change in functionality
08:26:32 × turlando quits (~turlando@user/turlando) (Read error: Connection reset by peer)
08:27:24 zeenk joins (~zeenk@2a02:2f04:a014:8700::7fe)
08:28:59 × califax quits (~califax@user/califx) (Ping timeout: 255 seconds)
08:29:59 turlando joins (~turlando@user/turlando)
08:31:03 <gensyst> jackdk, what was the LoC before/after?
08:31:44 <jackdk> ~4.5k -> ~3.5k
08:32:55 × turlando quits (~turlando@user/turlando) (Read error: Connection reset by peer)
08:33:21 <gensyst> impressive
08:33:38 <darkling> Very nice. Always a good day when something like that happens. :)
08:34:25 turlando joins (~turlando@user/turlando)
08:34:42 <jackdk> Impressive would have been not falling in love with an overcomplicated design in the first place, necessitating a day-and-a-half of careful refactoring so I had some confidence that the new version was right.
08:35:15 <darkling> Well, past-me is always an idiot. :)
08:39:01 accord joins (uid568320@id-568320.hampstead.irccloud.com)
08:40:47 <jackdk> How funny, past-me is a dummy too!
08:43:43 acidjnk joins (~acidjnk@p200300d6e715c450d0b080c45be0641e.dip0.t-ipconnect.de)
08:50:49 machinedgod joins (~machinedg@198.53.218.113)
08:52:48 × eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
08:55:40 <gensyst> jackdk, however it's a balance. hmmmm.
08:55:56 <gensyst> in my case what if the thing has not just quality but, e.g., color and location?
08:56:12 <gensyst> would be kinda convenient to just have it all in the same "thing" instead of separate function parameters
08:57:05 × machinedgod quits (~machinedg@198.53.218.113) (Ping timeout: 252 seconds)
08:58:07 merijn joins (~merijn@86.86.29.250)
08:58:42 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
08:58:54 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
08:59:07 <jackdk> What are you actually building? Function composition will let you fuse "get the colour out of a thing" with "compute something from the colour". If you want to write back a new colour, you could accept a lens instead of a function
09:01:30 califax joins (~califax@user/califx)
09:02:27 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
09:04:38 thongpv joins (~thongpv87@14.179.159.25)
09:15:47 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
09:16:20 avicenzi joins (~avicenzi@193.86.92.180)
09:18:01 alex` joins (~user@97.red-83-36-47.dynamicip.rima-tde.net)
09:20:18 × phma quits (phma@2001:5b0:212a:9278:328d:f1cd:3dee:19c5) (Read error: Connection reset by peer)
09:20:19 × tzh quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
09:27:53 <jackdk> gensyst: If it's ECS-ish, you could do something like this, but it still feels a bit overwrought. I dunno what Haskell ECS libs do though: https://www.irccloud.com/pastebin/vXKCVFzi/Quality.hs
09:28:45 <jackdk> I chose to let the typelevel tag force the type of the thing inside the structure; if you did not want to do this you could make it an associated type of the class, and let it vary with each instance.
09:30:13 cfricke joins (~cfricke@user/cfricke)
09:31:16 × use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) (Remote host closed the connection)
09:31:33 use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf)
09:31:55 × rekahsoft quits (~rekahsoft@bras-base-orllon1122w-grc-05-174-88-194-86.dsl.bell.ca) (Ping timeout: 252 seconds)
09:32:10 × Batzy quits (~quassel@user/batzy) (Ping timeout: 260 seconds)
09:32:10 × hiredman quits (~hiredman@frontier1.downey.family) (Ping timeout: 260 seconds)
09:32:16 × mei quits (~mei@user/mei) (Ping timeout: 248 seconds)
09:32:19 Batzy joins (~quassel@user/batzy)
09:34:53 mei joins (~mei@user/mei)
09:36:10 × thegeekinside quits (~thegeekin@189.180.66.244) (Ping timeout: 252 seconds)
09:38:51 hiredman joins (~hiredman@frontier1.downey.family)
09:44:35 nschoe joins (~q@141.101.51.197)
09:47:19 × werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 252 seconds)
09:50:41 Mahi joins (~Mahi@91-159-147-164.elisa-laajakaista.fi)
09:51:32 <Mahi> Hello! I long time programmer who's never done functional programming before, and I want to learn Haskell as my first functional language. Unfortunately I'm struggling with basic exercises, is it ok to ask for beginner help here?
09:52:06 <stefan-_> Mahi, sure
09:52:57 <Mahi> I'm unsurprisingly stuck on a task that I'd normally resolve with for loops - I need to filter elements from a list that are greater than the previous filtered element, e.g. [1, 3, 2, 6, 4, 8] would yield [1, 3, 6, 8]
09:53:08 werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
09:53:15 <Mahi> I attempted the following code, but it doesn't seem to work for all cases:
09:53:16 <Mahi> skipSmallers :: [Int] -> Int -> [Int]
09:53:16 <Mahi> skipSmallers [i] x = if i >= x then [i] else []
09:53:17 <Mahi> skipSmallers arr x =
09:53:17 <Mahi>     if (head arr) > x
09:53:18 <Mahi>         then head arr : skipSmallers (tail arr) (head arr)
09:53:18 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba)
09:53:18 <Mahi>     else skipSmallers (tail arr) x
09:53:19 <Mahi> nextIsGreater  :: [Int] -> [Int]
09:53:19 <Mahi> nextIsGreater [] = []
09:53:20 <Mahi> nextIsGreater arr = (head arr) : skipSmallers (tail arr) (head arr)
09:53:43 <_________> @Mahi use https://paste.tomsmeding.com when pasting code
09:53:44 <lambdabot> Unknown command, try @list
09:53:50 <Mahi> Any hints on what I'm doing wrong? I'm trying to complete an online course and the tester just tells me that tests didn't pass, no signal on what went wrong. Also few tests went through.
09:53:57 chele joins (~chele@user/chele)
09:53:58 <Mahi> https://paste.tomsmeding.com/n5DWo4kY
09:54:23 <Mahi> There's probably a much simpler way that I'm unaware of...
09:54:55 × hiredman quits (~hiredman@frontier1.downey.family) (Ping timeout: 260 seconds)
09:55:26 teo joins (~teo@user/teo)
09:55:58 <opqdonut> Mahi: that looks about right
09:56:14 <opqdonut> you could use pattern matching instead of head & tail, but that's not that crucial
09:56:40 <opqdonut> but a helper function that has one more parameter for keeping the state is the right approach (at least when learning the language :)
09:56:59 <stefan-_> Mahi, should the next elements be greater-than or greater-equal-than?
09:57:09 <stefan-_> you have: "i >= x"
09:57:40 <Mahi> Greater-than, but I've tried both approaches numerous times already :D
09:57:47 phma joins (phma@2001:5b0:210d:808:caa:8672:8beb:4096)
09:57:48 <_________> Mahi: what's `skipSmallers [] 1` ?
09:57:50 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba) (Ping timeout: 260 seconds)
09:58:13 <Mahi> Idk I never call that because the function is always invoked through `nextIsGreater`
09:58:22 <_________> oh
09:58:53 <_________> then `nextIsGreater [1]` ?
09:59:04 <Mahi> I'm clueless with Haskell so I just assumed that I must be doing something wrong, but now that I've heard your thoughts I guess I'll send a message to the lecturer and ask if there's something wrong with the tester instead
09:59:36 <int-e> well your code has at least one bug, which _________ is guiding you towards
09:59:58 <Mahi> Ahh yes I'm not handling `[1]` properly, it ends up calling `skipSmallers []`
09:59:59 × gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.8)
10:00:07 <Mahi> That's the one yes?
10:00:12 <_________> yeah
10:00:18 <Mahi> Thank you very much, I'll see if that helps
10:01:15 hiredman joins (~hiredman@frontier1.downey.family)
10:03:13 <int-e> Pattern matching *would* make this more readable indeed... you can use (i:is) and it'll only match non-empty lists, and then `i` is the head and `is` is the tail.
10:04:34 <Mahi> All the tests passed now, thank you everyone! :) I will look into pattern matching next, I knew there must be a cleaner way
10:04:39 <int-e> Hmm also `arr` ...they're lists, not arrays.
10:05:19 × xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 248 seconds)
10:05:26 <Mahi> Ah yes, should've been obvious. Thank you. int-e
10:05:37 <gensyst> jackdk, lol i'm not going to add lenses - but thanks i'll store your example for future references
10:05:46 <gensyst> jackdk, i'm going to go with your original advice of simplicity.
10:06:12 <gensyst> I wonder how many "useless" typeclasses I have in my codebase... could potentially be replaced with function params
10:06:14 <gensyst> :S
10:06:16 <gensyst> fuuuuuuuu
10:07:27 <geekosaur> arguably all of them, because they are function params 🙂
10:08:04 <gensyst> so what's the point. i'm now more confused than ever
10:08:49 <geekosaur> the compiler passes them for you, and when used correctly they tend to be more lawful
10:09:35 <geekosaur> manual record passing, on the other hand, is more work bbut more flexible because you can swap around functions in the record for particular calls which you can't do with typeclasses
10:10:43 dcoutts joins (~duncan@host86-176-29-74.range86-176.btcentralplus.com)
10:11:19 × Mahi quits (~Mahi@91-159-147-164.elisa-laajakaista.fi) (Quit: Client closed)
10:12:53 use-value1 joins (~Thunderbi@2a00:23c6:8a03:2f01:bdd1:543a:a9a8:b96c)
10:13:27 troydm joins (~troydm@user/troydm)
10:14:06 <int-e> classes can be very convenient... with data Tree a = Leaf a | Node [Tree a] deriving Eq, you can have foo :: Eq a => Tree a -> Tree a -> Bool; foo = (==), and the compiler will take care of generating the derived equality from the Eq record for `a` for you. Record style, foo would be something like foo eqA = eqField (deriveEqTree eqA) instead, where `eqField` selects the (==) method of the...
10:14:12 <int-e> ...class. And that's a simple case.
10:14:56 <int-e> And there's quite a lot of boilerplate covered by `deriving`.
10:16:23 × use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) (Ping timeout: 264 seconds)
10:16:24 use-value1 is now known as use-value
10:16:28 Mahi joins (~Mahi@91-159-147-164.elisa-laajakaista.fi)
10:18:15 × kuttenbrunzer quits (~kuttenbru@2a02:8108:8b80:1d48:399d:ce45:6432:bc43) (Quit: Leaving)
10:18:39 × Mahi quits (~Mahi@91-159-147-164.elisa-laajakaista.fi) (Client Quit)
10:19:46 <gensyst> ah, so they really are just for convenience - and now it's the programmer's choice how much convenience they want!
10:20:41 <geekosaur> and for consistency: you know it'll behave the same way everywhere if it's a typeclass
10:21:01 <geekosaur> you have to ensure that yourself if you pass a record of functions manually
10:21:23 gaff joins (~gaff@49.207.232.223)
10:23:19 <gaff> does haddock turn a multiline comment into a single line? for example, `-- | this is line 1. -- this is line 2.` does this become `this is line this is line 2`?
10:24:44 <geekosaur> looks to me like yes
10:25:01 <geekosaur> put an empty comment between if you want a line break
10:25:02 <gaff> ah that is sort of a disappointment
10:25:19 <gaff> ok
10:25:20 <geekosaur> -- | this is line 1\n--\n-- this is line 2
10:25:32 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
10:25:32 <gaff> ok thanks
10:25:54 <geekosaur> well, ideally it wants to render nicely on anything from a phone t a 4k display, so it wants to reflow text
10:26:35 × phma quits (phma@2001:5b0:210d:808:caa:8672:8beb:4096) (Read error: Connection reset by peer)
10:26:35 <gaff> seems to me haddock shouldn't be mergining different lines of comments
10:27:10 <mauke> why?
10:27:45 <gaff> well, that's why people write multiline comments because they want it "multiline" comments, you see
10:28:05 <gaff> at least i want to that way
10:28:35 phma joins (~phma@host-67-44-208-170.hnremote.net)
10:29:15 <geekosaur> usually I write multiline comments because I ran out of space on the first line
10:30:22 <gaff> well, that could be one reason. but you could also write multiline comments because you simply want it multiline
10:30:41 <gaff> it cuts both ways
10:31:14 <gaff> but the tooling seems to have gone along with your prefernce
10:31:20 <geekosaur> there might be some markup to preserve line breaks; I only know basic haddock
10:31:25 <tomsmeding> gensyst: example of that consistency at work: if you make a Set, then certainly you'd want e.g. lookup, insert, union, etc. to use the same ordering for the elements, otherwise things would go very wrong. Typeclasses ensure there is precisely 1 definition of ordering for the element type
10:31:51 <tomsmeding> ("ensure" modulo unsafeCoerce hackery)
10:32:18 <gensyst> tomsmeding, great point!
10:33:09 <gaff> another question: when generating haddock documentation through a cabal build, with hyperlinked source, when you get into the source code, some of the links there are broken. is this a known problem?
10:38:54 <gaff> cabal version 3.4 is what i use
10:43:52 <geekosaur> cabal has problems finding stuff in the store, sadly. `--haddock-for-hackage` tends to work better.
10:44:02 <gaff> geekosaur: well, your suggestion of putting an empty comment does give multiline comments. thanks a bunch.
10:44:51 <gaff> `--haddock-for-hackage` -- is that a cabal option?
10:45:05 <geekosaur> `stack` puts a bit more effort into maintaining a central documentation registry, at the expense of needing to do more work to expose the right versions of things in the registry (which haddock has little support for)
10:45:18 <geekosaur> `cabal haddock` option, yes
10:45:34 <mauke> https://haskell-haddock.readthedocs.io/en/latest/markup.html#paragraphs
10:45:36 <gaff> ok, didn't see that in the documentation
10:46:53 <gensyst> tomsmeding, jackdk, geekosaur: The question is at the bottom: https://dpaste.com/FH22DR53P Is that even possible? The issue is that StringSound can't AFAIK be put into line 36 because there is no sound to refer to (since it's inside of the class)
10:46:55 × foul_owl quits (~kerry@157.97.134.62) (Read error: Connection reset by peer)
10:47:08 <gaff> mauke: thank you very much
10:47:48 Pickchea joins (~private@user/pickchea)
10:48:24 <gensyst> BTW I Know this particular case can be replaced with a function call, but my real world use-case has more things in Animal (not just "getSound"). So since I already have other things, I might as well throw getSound in there too. That's the idea.
10:49:59 × freeside_ quits (~mengwong@202.161.55.11) (Ping timeout: 264 seconds)
10:50:29 <gensyst> So, instead of having a separate function parameter in foo to extract the sound, I just put a getSound in with the existing Animal - for convenience
10:50:33 <gensyst> it would be cool if this can be pulled off
10:50:44 <geekosaur> gensyst, I'm not sure exactly how to do it but an associated type is actually a type family
10:51:43 <geekosaur> `StringSound (Sound animal)` might "just work"
10:52:13 <mauke> my first attempt would be something like: `(Animal animal, StringSound (Sound animal)) => ...`. is that valid syntax?
10:52:38 xff0x joins (~xff0x@2405:6580:b080:900:edaa:53ba:199:2268)
10:52:56 <geekosaur> looks like mauke and I went the same direction
10:53:11 <geekosaur> nice to know I'm not completely off the wall
10:56:03 <gensyst> that compiles lol
10:56:08 <gensyst> mauke's one
10:56:20 <gensyst> gotta try this out...
10:56:57 <geekosaur> mine assumed yoou kept the existing `Animal animal`, so it's the same thing
10:57:05 × gaff quits (~gaff@49.207.232.223) ()
10:57:27 <gensyst> of course you're right, sorry about that
10:57:27 <geekosaur> associated types are shorthand for defining a type family after the class and a `type instance` to go with each class instance
10:58:05 <geekosaur> so it should work fine "outside" the class/instance
11:03:13 <mauke> I don't understand type families, but associated types are fine
11:03:42 <geekosaur> I have a simplistic understanding of them
11:03:53 <gensyst> This is mind-blowing... this is like dynamically typed languages except you're not crashing at runtime
11:03:54 <geekosaur> associated types are certainly easier
11:04:17 <gensyst> this is the first time i use associated types
11:05:04 × telser quits (~quassel@user/telser) (Ping timeout: 248 seconds)
11:05:10 foul_owl joins (~kerry@157.97.134.63)
11:05:41 telser joins (~quassel@user/telser)
11:06:01 <gensyst> But can you see where I'm coming from (with the thing about just adding what I need into the existing typeclass instead of adding an extra function parameter to extract the sound)? Is this a legitimate use case, or overkill?
11:07:03 <geekosaur> it has a certain "trying to use typeclasses for OOP" feel to it, but that might just be the example
11:17:48 × accord quits (uid568320@id-568320.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
11:18:49 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
11:22:59 × kritzefitz quits (~kritzefit@debian/kritzefitz) (Ping timeout: 264 seconds)
11:25:41 × xeelad quits (~xeelad@pool-151-202-46-37.nycmny.fios.verizon.net) (Read error: Connection reset by peer)
11:26:20 xeelad joins (~xeelad@pool-151-202-46-37.nycmny.fios.verizon.net)
11:28:18 ubert1 joins (~Thunderbi@2a02:8109:abc0:6434:2d8a:1036:b201:e1eb)
11:28:38 × razetime quits (~Thunderbi@117.193.3.163) (Ping timeout: 246 seconds)
11:29:37 × econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity)
11:31:18 beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
11:32:07 ccapndave joins (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch)
11:32:11 × xeelad quits (~xeelad@pool-151-202-46-37.nycmny.fios.verizon.net) (Ping timeout: 252 seconds)
11:32:51 xeelad joins (~xeelad@pool-151-202-46-37.nycmny.fios.verizon.net)
11:34:18 Bocaneri joins (~sauvin@user/Sauvin)
11:34:24 × Sauvin quits (~sauvin@user/Sauvin) (Ping timeout: 248 seconds)
11:34:39 Bocaneri is now known as Sauvin
11:35:23 × xeelad quits (~xeelad@pool-151-202-46-37.nycmny.fios.verizon.net) (Max SendQ exceeded)
11:36:57 xeelad joins (~xeelad@pool-151-202-46-37.nycmny.fios.verizon.net)
11:38:16 Bocaneri joins (~sauvin@user/Sauvin)
11:38:39 Bocaneri is now known as Guest4854
11:40:23 tomsmeding thinks of associated types like a type family bundled with a type class, instead of the other way round
11:40:59 × Sauvin quits (~sauvin@user/Sauvin) (Ping timeout: 248 seconds)
11:41:44 <tomsmeding> if you haven't yet, check out the difference between open type families and closed type families, and use closed type families always for fucks sake unless you have no other choice
11:42:24 <tomsmeding> open type families feel much more like a type class indeed
11:43:24 <[exa]> open type familiess are 1:1 convertible to MPTCs, no?
11:45:23 <dminuoso> https://hackage.haskell.org/package/powerdns-0.4.1/docs/src/PowerDNS.API.Zones.html#CIText
11:45:32 Lycurgus joins (~juan@user/Lycurgus)
11:45:40 <dminuoso> https://hackage.haskell.org/package/powerdns-0.4.1/docs/PowerDNS-API-Zones.html#t:CIText
11:45:56 <dminuoso> Oh hold on.
11:46:19 <dminuoso> Staging restriction surprise. Move along
11:46:59 gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
11:49:07 × mmhat quits (~mmh@p200300f1c707be48ee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.8)
11:49:13 szkl joins (uid110435@id-110435.uxbridge.irccloud.com)
11:49:51 mc47 joins (~mc47@xmonad/TheMC47)
11:51:38 <tomsmeding> [exa]: at least to associated types, but perhaps also to MPTCs yes
11:52:14 <geekosaur> to MPTCs with fundeps, specifically, iirc
11:52:23 <tomsmeding> certainly
11:52:43 <tomsmeding> dminuoso: ... staging restriction is TH, right? Where the ** does TH come into CIText?
11:53:54 Guest4854 is now known as Sauvin
11:55:14 × ccapndave quits (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) (Quit: My MacBook has gone to sleep. ZZZzzz…)
11:56:08 <dminuoso> tomsmeding: Hah, I was just doing some refactoring from generic aeson into TH, and I had some "no instance for" errors I couldnt make heads or tails of
12:05:55 <gensyst> tomsmeding, "and use closed type families always" why?
12:06:15 <gensyst> what's wrong with associated types?
12:06:36 <geekosaur> he meant as opposed to directly using open type families
12:06:40 <gensyst> ah ok
12:06:43 <gensyst> great to know, thanks
12:06:54 <geekosaur> associated types are fine because the typeclass effectively "closes" them
12:08:05 <geekosaur> more specifically because you can test typeclass membership, whereas using an open type family at a type it has no instance for will error out with no way to test for it beforehand
12:08:36 <geekosaur> s/test/verify
12:10:06 <gensyst> geekosaur, error out at runtime?
12:10:42 <geekosaur> compile time, but with a worse error message than with a closed type family
12:10:45 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:49d:d667:4c42:a171) (Quit: WeeChat 2.8)
12:10:46 <gensyst> ok
12:11:25 <geekosaur> because an open type family can have instances defined "after the fact" by other modules/packages, so errors have to be caught by the linker instead of the compiler
12:11:58 <geekosaur> whereas the compiler knows exactly what instances exist with a closed type family
12:14:33 <albet70> how to declare a recursive type? data Task = F | E, but I want to make it like data Task = F | E | Task, how to change?
12:16:29 <albet70> a -> b can't be an ADT type?
12:16:41 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
12:18:07 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
12:18:20 <geekosaur> `data Task = F | E | T Task`
12:18:32 <geekosaur> it has to have a data constructor
12:19:07 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
12:19:08 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
12:19:40 <albet70> ok
12:20:00 <gensyst> Thank you so much for the help guys.
12:20:15 <gensyst> I'm using associate types without understanding them, and it's useful.
12:20:37 <gensyst> One day I'll try to understand them more
12:22:10 <gensyst> geekosaur, tomsmeding, jackdk post a lightning invoice here - i'll send some coffee sats your way
12:22:17 freeside joins (~mengwong@103.252.202.170)
12:22:39 <gensyst> (or pm it to me)
12:23:11 <gensyst> & mauke
12:23:34 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
12:23:36 <gensyst> & int-e
12:23:55 <gensyst> (hope i didn't forget anyone - let me know if i did)
12:26:49 × freeside quits (~mengwong@103.252.202.170) (Ping timeout: 252 seconds)
12:26:52 <[exa]> tomsmeding geekosaur ah yeh true, fundeps. thanks.
12:28:39 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 252 seconds)
12:28:40 × merijn quits (~merijn@86.86.29.250) (Quit: leaving)
12:31:02 danza joins (~francesco@151.43.80.9)
12:31:59 × alex` quits (~user@97.red-83-36-47.dynamicip.rima-tde.net) (Ping timeout: 248 seconds)
12:33:52 titibandit1 joins (~titibandi@xdsl-85-197-0-96.nc.de)
12:36:50 razetime joins (~Thunderbi@117.193.3.163)
12:36:50 × danza quits (~francesco@151.43.80.9) (Read error: Connection reset by peer)
12:38:01 jumper149 joins (~jumper149@base.felixspringer.xyz)
12:42:35 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
12:43:59 freeside joins (~mengwong@103.252.202.170)
12:45:54 <mauke> data Task = Finite Int Bool | Infinite
12:48:31 × freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds)
12:53:01 <tomsmeding> gensyst: having helped someone is enough for me :)
12:53:04 danza joins (~francesco@151.37.98.16)
12:53:35 <geekosaur> same
12:56:27 <merijn> Feel free to forwards all your rewards to me ;)
13:04:47 × titibandit1 quits (~titibandi@xdsl-85-197-0-96.nc.de) (Remote host closed the connection)
13:06:20 kritzefitz joins (~kritzefit@debian/kritzefitz)
13:08:16 sidk joins (~sidk@102.70.0.138)
13:10:26 × Lycurgus quits (~juan@user/Lycurgus) (Quit: Exeunt: personae.ai-integration.biz)
13:10:49 × nschoe quits (~q@141.101.51.197) (Ping timeout: 252 seconds)
13:11:30 × xilo quits (~yourname@user/xilo) (Ping timeout: 260 seconds)
13:12:03 × cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 3.7.1)
13:13:42 <sidk> barrucadu dejafu looks really cool and I'd like to use it to test my project -- a concurrent version control store that uses Servant (https://hackage.haskell.org/package/inferno-vc-0.1.0). I was wondering if you'd tried something like that before, or if you had any pointers for me on how to get started? Cheers
13:21:12 lortabac joins (~lortabac@2a01:e0a:541:b8f0:4748:566a:a8dd:fb06)
13:32:36 × lagash_ quits (lagash@lagash.shelltalk.net) (Remote host closed the connection)
13:37:40 <gensyst> thanks again guys
13:40:56 lagash_ joins (lagash@lagash.shelltalk.net)
13:44:46 freeside joins (~mengwong@103.252.202.170)
13:59:07 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:4748:566a:a8dd:fb06) (Quit: WeeChat 2.8)
13:59:15 Inst__ joins (~Inst@c-98-208-218-119.hsd1.fl.comcast.net)
14:01:49 jakalx joins (~jakalx@base.jakalx.net)
14:02:20 × Inst_ quits (~Inst@2601:6c4:4081:54f0:88ac:5549:dc57:9767) (Ping timeout: 255 seconds)
14:06:24 × turlando quits (~turlando@user/turlando) (Ping timeout: 248 seconds)
14:08:30 × mjacob_ quits (~mjacob@adrastea.uberspace.de) (Remote host closed the connection)
14:08:49 <Hammdist> in haskell ghc core library, how do I get the type of an Expr? I had found a function yesterday but I forgot to make a note of it and I can't find it again due to huge library. thanks
14:13:57 <dminuoso> Hammdist: Good question, I suggest you ask for a pointer in #haskell-language-server
14:14:51 <dminuoso> Also, merely an `Expr` might be difficult. Do you want the Expr typed standalone?
14:14:59 <dminuoso> Or with respect to its environment?
14:19:17 × gensyst quits (gensyst@user/gensyst) (Quit: Leaving)
14:22:52 <Hammdist> wrt environment
14:27:08 <Hammdist> ah I found it again 'exprtotype' but looking at the implementation it looks useless
14:27:13 × use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:bdd1:543a:a9a8:b96c) (Quit: use-value)
14:27:37 <Hammdist> exprToType
14:30:03 kurbus joins (~kurbus@user/kurbus)
14:30:08 <merijn> What's up with binary's deprecated/messed up 0.9 and 0.10 releases??
14:35:12 Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542)
14:35:12 × danza quits (~francesco@151.37.98.16) (Read error: Connection reset by peer)
14:35:35 danza joins (~francesco@151.37.98.16)
14:36:06 turlando joins (~turlando@user/turlando)
14:37:27 shriekingnoise joins (~shrieking@186.137.175.87)
14:38:16 jero98772 joins (~jero98772@2800:484:1d80:d8ce:9815:cfda:3661:17bb)
14:39:51 nschoe joins (~q@2a04:cec0:10cc:8516:9f30:a105:6adc:b8ea)
14:40:18 × nschoe quits (~q@2a04:cec0:10cc:8516:9f30:a105:6adc:b8ea) (Client Quit)
14:41:23 lortabac joins (~lortabac@2a01:e0a:541:b8f0:4748:566a:a8dd:fb06)
14:41:45 thegeekinside joins (~thegeekin@189.180.66.244)
14:48:13 × sidk quits (~sidk@102.70.0.138) (Ping timeout: 260 seconds)
14:49:02 <dminuoso> Hammdist: Ask the HLS folks then.
14:49:10 <dminuoso> Hammdist: Because that feature exactly is rigged into HLS
14:49:26 <dminuoso> Or possibly in #ghc, but I think #haskell-language-server might be a better bet
14:49:33 × lortabac quits (~lortabac@2a01:e0a:541:b8f0:4748:566a:a8dd:fb06) (Quit: WeeChat 2.8)
14:49:45 <Hammdist> not sure that would be helpful afaik HLS is based on querying types in the AST, not in core
14:50:02 <dminuoso> Oh now I see what you meant by `core library` heh
14:50:21 <dminuoso> Hammdist: there isnt any general inference for it.
14:50:26 <dminuoso> In fact it cant even exist
14:50:54 <Hammdist> :/
14:50:55 <dminuoso> It has full blown impredicative types
14:51:11 × thongpv quits (~thongpv87@14.179.159.25) (Ping timeout: 248 seconds)
14:51:22 <Hammdist> well what I really need is the arity like in the simply typed lambda calculus
14:51:23 <dminuoso> (Well given quicklook, perhaps we could add it to core after the fact I dont know)
14:51:36 <geekosaur> I'm not sure useful types exist at all in core since the typechecker and associated `TcM` are gone at that point
14:51:40 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
14:51:49 <dminuoso> geekosaur: of course they exist, all core is explicitly typed.
14:52:35 <dminuoso> core lint is the type checker that does the type checking for it
14:52:54 <dminuoso> (and it being explicitly typed is why impredicative types are not a problem)
14:53:32 × varoo quits (~varoo@122.161.91.19) (Quit: Probably got disconnect dure to unstable internet)
14:53:33 × danza quits (~francesco@151.37.98.16) (Read error: Connection reset by peer)
14:53:47 varoo joins (~varoo@2401:4900:4111:3c14:0:13:cf76:1001)
14:54:18 × gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.8)
14:54:23 × sammelweis quits (~quassel@c-68-48-18-140.hsd1.mi.comcast.net) (Ping timeout: 248 seconds)
14:54:24 <dminuoso> Hammdist: So arity analysis is one of the things the simplifier is concerned about
14:55:02 <dminuoso> See compiler/GHC/Core/Opt/CallArity.hs
14:55:04 sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
14:56:34 Sgeo joins (~Sgeo@user/sgeo)
14:57:46 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba)
14:58:40 <dminuoso> Hammdist: thats for inferring arity from its use.
14:59:44 <dminuoso> Hammdist: similarly, refer to ./compiler/GHC/Core/Opt/Arity.hs for figuring out arity from a definition side.
15:00:22 <Hammdist> callArityAnalProgram :: CoreProgram -> CoreProgram <-- I don't understand this signature. where would the arity analysis output be?
15:00:49 <Hammdist> you must excuse me I'm trying to do something rather difficult and I'm relatively new to Haskell at the same time
15:00:53 <geekosaur> annotations to the CoreProgram
15:02:02 <dminuoso> Hammdist: long story short, at Core level there isnt something like a simple "tell me the arity"
15:02:19 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba) (Ping timeout: 252 seconds)
15:02:21 <dminuoso> consider, that it requires computation - possibly dependent on arguments - to know that.
15:02:46 <dminuoso> which is why there's two different heuristics to figure out the arity of something by either doing some analysis on the definition side, or some analysis from usage
15:02:48 <dminuoso> for example
15:03:02 <dminuoso> if you see `f 1 2 3` somewhere, you can without hesitation simply assume `f` to take *at least* 3 arguments.
15:03:35 <dminuoso> and there's also interaction with lazyness
15:03:42 <dminuoso> and pattern matching
15:03:48 <dminuoso> for instance
15:04:08 <dminuoso> % let f = \1 -> \x -> () in f undefined `seq` ()
15:04:08 <yahb2> *** Exception: Prelude.undefined ; CallStack (from HasCallStack): ; error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err ; undefined, called at <interactive>:96:29 in interactive:Gh...
15:04:14 <dminuoso> % let f = \1 x -> () in f undefined `seq` ()
15:04:14 <yahb2> ()
15:04:28 <dminuoso> What you consider "arity" kind of depends on the mind model you have
15:04:46 <dminuoso> and GHC has a lot of tools to generate efficient code according to the semantics
15:04:48 <[exa]> > id id id id id id id gcd 5 3
15:04:49 <lambdabot> 1
15:04:52 <[exa]> ^ don't.
15:07:14 × ddellacosta quits (~ddellacos@89.45.224.176) (Ping timeout: 260 seconds)
15:12:16 <merijn> hmm
15:12:56 <merijn> unix-compat 0.6 has a revision to support unix 2.8.0.0, but cabal is rejecting claiming it excludes 2.8 (the old bound before revision)
15:13:34 <dminuoso> merijn: the opposite is the case.
15:13:43 <dminuoso> https://hackage.haskell.org/package/unix-compat-0.6/revisions/
15:13:51 <dminuoso> from >=2.6 && <2.9 to >=2.6 && <2.8
15:14:37 <merijn> oh, wait, yeah
15:14:39 <merijn> well fuck
15:15:44 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
15:17:12 <merijn> fun times, now I need to lower a bunch of other constraints too
15:21:01 oldfashionedcow joins (~Rahul_San@user/oldfashionedcow)
15:23:01 <merijn> Only had to bump 77 bounds to update this shit xD
15:37:29 × acidjnk quits (~acidjnk@p200300d6e715c450d0b080c45be0641e.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
15:37:39 hounded joins (~hounded@2603:7000:da43:eccc::cec)
15:37:59 hounded_woodstoc joins (~hounded@2603:7000:da43:eccc::cec)
15:38:18 CiaoSen joins (~Jura@2003:c9:5732:8400:2a3a:4dff:fe84:dbd5)
15:38:24 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
15:48:58 × kurbus quits (~kurbus@user/kurbus) (Quit: Client closed)
15:49:25 bitmapper joins (uid464869@id-464869.lymington.irccloud.com)
15:52:35 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba)
15:57:08 × phma quits (~phma@host-67-44-208-170.hnremote.net) (Read error: Connection reset by peer)
15:57:38 titibandit1 joins (~titibandi@xdsl-85-197-0-96.nc.de)
16:00:40 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
16:05:40 phma joins (~phma@host-67-44-208-33.hnremote.net)
16:06:54 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba) (Remote host closed the connection)
16:08:10 × beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Remote host closed the connection)
16:08:34 beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
16:11:18 kurbus joins (~kurbus@user/kurbus)
16:11:21 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
16:11:58 × Cale quits (~cale@cpebc4dfb3052b3-cmbc4dfb3052b0.cpe.net.cable.rogers.com) (Read error: Connection reset by peer)
16:13:25 × trev quits (~trev@user/trev) (Remote host closed the connection)
16:16:18 × jumper149 quits (~jumper149@base.felixspringer.xyz) (Quit: WeeChat 3.8)
16:17:28 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
16:23:53 × kurbus quits (~kurbus@user/kurbus) (Ping timeout: 260 seconds)
16:27:06 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
16:29:21 × kenran` quits (~user@user/kenran) (Remote host closed the connection)
16:29:51 × razetime quits (~Thunderbi@117.193.3.163) (Remote host closed the connection)
16:34:54 gurkenglas joins (~gurkengla@dynamic-046-114-176-228.46.114.pool.telefonica.de)
16:36:49 × ubert1 quits (~Thunderbi@2a02:8109:abc0:6434:2d8a:1036:b201:e1eb) (Quit: ubert1)
16:38:52 sadmax joins (~user@209-172-15-113-ama.pathwayz.com)
16:40:25 ec_ joins (~ec@gateway/tor-sasl/ec)
16:43:14 ddellacosta joins (~ddellacos@143.244.47.100)
16:43:59 × ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 255 seconds)
16:50:48 kurbus joins (~kurbus@user/kurbus)
16:54:05 bgs joins (~bgs@212-85-160-171.dynamic.telemach.net)
16:56:25 ec joins (~ec@gateway/tor-sasl/ec)
16:56:41 × avicenzi quits (~avicenzi@193.86.92.180) (Ping timeout: 252 seconds)
17:00:11 × ec_ quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 255 seconds)
17:03:35 × ddellacosta quits (~ddellacos@143.244.47.100) (Ping timeout: 246 seconds)
17:04:04 × remedan quits (~remedan@ip-94-112-0-18.bb.vodafone.cz) (Remote host closed the connection)
17:07:25 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba)
17:08:22 mokee joins (~mokee@37.228.215.106)
17:09:54 use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:d1aa:86d0:796e:605)
17:11:50 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba) (Ping timeout: 260 seconds)
17:14:55 <sm> hehe, better you than your users
17:16:10 <merijn> sm: That was without being able to bump unix/directory, sadly :\
17:16:30 gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
17:17:24 mechap joins (~mechap@user/mechap)
17:18:22 remedan joins (~remedan@ip-94-112-0-18.bb.vodafone.cz)
17:24:08 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Quit: restart)
17:25:07 merijn joins (~merijn@86.86.29.250)
17:25:21 forell_ joins (~forell@host-178-216-90-220.sta.tvknaszapraca.pl)
17:26:04 × bgs quits (~bgs@212-85-160-171.dynamic.telemach.net) (Ping timeout: 260 seconds)
17:26:04 × forell quits (~forell@user/forell) (Ping timeout: 260 seconds)
17:28:28 bgs joins (~bgs@212-85-160-171.dynamic.telemach.net)
17:32:53 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
17:33:05 azimut joins (~azimut@gateway/tor-sasl/azimut)
17:36:19 × varoo quits (~varoo@2401:4900:4111:3c14:0:13:cf76:1001) (Read error: Connection reset by peer)
17:36:55 varoo joins (~varoo@122.161.91.19)
17:36:59 × titibandit1 quits (~titibandi@xdsl-85-197-0-96.nc.de) (Quit: Leaving.)
17:37:03 jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
17:39:35 × sadmax quits (~user@209-172-15-113-ama.pathwayz.com) (Ping timeout: 252 seconds)
17:45:39 jmdaemon joins (~jmdaemon@user/jmdaemon)
17:46:07 codaraxis joins (~codaraxis@user/codaraxis)
17:50:10 × chele quits (~chele@user/chele) (Remote host closed the connection)
17:55:36 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba)
17:55:44 × mechap quits (~mechap@user/mechap) (Ping timeout: 248 seconds)
17:56:47 mechap joins (~mechap@user/mechap)
17:56:59 tzh joins (~tzh@c-24-21-73-154.hsd1.wa.comcast.net)
17:56:59 × motherfsck quits (~motherfsc@user/motherfsck) (Remote host closed the connection)
17:58:32 <Las[m]> Does anyone know how you can unsafely create a coercion, i.e. `Coercible a b` for two `a` and `b`?
17:59:08 × Hammdist quits (~Hammdist@67.169.114.135) (Quit: Client closed)
18:00:02 <geekosaur> you can't; they're a figment of the typechecker
18:00:37 <EvanR> two a and one b? two a and two b?
18:00:40 <geekosaur> well, maybe there's a plugin that you could run during typechecking that could manufacture one
18:01:11 ft joins (~ft@p4fc2a257.dip0.t-ipconnect.de)
18:01:26 <geekosaur> and, well, it could be very unsafe
18:01:47 × gurkenglas quits (~gurkengla@dynamic-046-114-176-228.46.114.pool.telefonica.de) (Ping timeout: 248 seconds)
18:03:10 × teo quits (~teo@user/teo) (Ping timeout: 260 seconds)
18:03:33 <Las[m]> What happens if I do `unsafeCoerce (d :: Dict (Coercible ()) ()) :: Dict (Coercible a) b`?
18:03:37 <Las[m]> `Dict` from sop-core
18:04:10 Lycurgus joins (~juan@user/Lycurgus)
18:04:53 <geekosaur> my understanding is that Coercible isn't actually a Dict
18:05:06 <geekosaur> it's a hack inside the typechecker
18:05:35 bhall joins (~brunohall@195.147.207.136)
18:05:41 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 252 seconds)
18:05:41 emmanuelux joins (~emmanuelu@user/emmanuelux)
18:07:14 <geekosaur> https://downloads.haskell.org/ghc/9.2.5/docs/html/libraries/base-4.16.4.0/Data-Coerce.html#t:Coercible "This class does not have regular instances; instead they are created on-the-fly during type-checking. Trying to manually declare an instance of Coercible is an error."
18:07:17 proportions joins (~proportio@91.150.188.137)
18:08:25 <geekosaur> http://research.microsoft.com/en-us/um/people/simonpj/papers/ext-f/coercible.pdf
18:08:37 <geekosaur> that's what I was really looking for
18:09:11 <Las[m]> thanks
18:10:35 × kurbus quits (~kurbus@user/kurbus) (Quit: Client closed)
18:10:48 kurbus joins (~kurbus@user/kurbus)
18:10:56 cheater_ joins (~Username@user/cheater)
18:11:00 econo joins (uid147250@user/econo)
18:11:02 × oldfashionedcow quits (~Rahul_San@user/oldfashionedcow) (Quit: WeeChat 3.8)
18:11:14 <EvanR> type classes vs the world. Being an instance of a class is like a logical assertion which can be used as part of proof of a larger assertion
18:11:34 <EvanR> somehow got confused with ad hoc polymorphism support dictionaries xD
18:13:31 oldfashionedcow joins (~Rahul_San@user/oldfashionedcow)
18:13:44 proportions parts (~proportio@91.150.188.137) ()
18:13:51 × cheater quits (~Username@user/cheater) (Ping timeout: 248 seconds)
18:14:01 cheater_ is now known as cheater
18:14:36 × Inst__ quits (~Inst@c-98-208-218-119.hsd1.fl.comcast.net) (Remote host closed the connection)
18:14:53 Inst__ joins (~Inst@2601:6c4:4081:54f0:d8af:1b99:f61a:780e)
18:15:30 × Lycurgus quits (~juan@user/Lycurgus) (Quit: Exeunt: personae.ai-integration.biz)
18:16:41 × ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 255 seconds)
18:18:01 × oldfashionedcow quits (~Rahul_San@user/oldfashionedcow) (Read error: Connection reset by peer)
18:19:16 ec joins (~ec@gateway/tor-sasl/ec)
18:20:50 bontaq joins (~user@ool-45779fe5.dyn.optonline.net)
18:21:14 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
18:24:10 oldfashionedcow joins (~Rahul_San@user/oldfashionedcow)
18:24:51 × Xeroine quits (~Xeroine@user/xeroine) (Ping timeout: 260 seconds)
18:25:21 simendsjo joins (~user@84.211.91.241)
18:26:12 Xeroine joins (~Xeroine@user/xeroine)
18:27:51 tremon joins (~tremon@83-85-213-108.cable.dynamic.v4.ziggo.nl)
18:29:35 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
18:30:25 kuribas joins (~user@ptr-17d51enb5ebo8t8l3i4.18120a2.ip6.access.telenet.be)
18:30:49 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 260 seconds)
18:36:31 × beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Ping timeout: 260 seconds)
18:37:49 × bitmapper quits (uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
18:39:30 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba) (Remote host closed the connection)
18:40:03 king_gs joins (~Thunderbi@2806:103e:29:34e5:ecc6:ec8d:1c5b:35a6)
18:44:05 × simendsjo quits (~user@84.211.91.241) (Remote host closed the connection)
18:44:58 beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt)
18:49:14 × beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Ping timeout: 246 seconds)
18:56:54 acidjnk joins (~acidjnk@p200300d6e715c483d4ac9ea2255c502f.dip0.t-ipconnect.de)
18:57:01 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
18:59:17 akegalj joins (~akegalj@222-217.dsl.iskon.hr)
19:01:43 × CiaoSen quits (~Jura@2003:c9:5732:8400:2a3a:4dff:fe84:dbd5) (Ping timeout: 252 seconds)
19:02:10 × oldfashionedcow quits (~Rahul_San@user/oldfashionedcow) (Quit: WeeChat 3.8)
19:04:03 <jean-paul[m]> is there a megaparsec combinator for "take exactly N tokens matched by P"?
19:05:32 <jean-paul[m]> meeh. count is in the index. which is exactly what I thought it would be. it's just not on the Text.Megaparsec page. :/
19:07:22 beteigeuze joins (~Thunderbi@bl14-81-220.dsl.telepac.pt)
19:10:34 gensyst joins (gensyst@user/gensyst)
19:11:45 <byorgey> jean-paul[m]: that means it's not exported
19:12:02 <gensyst> How can I get rid of the warning? https://dpaste.com/D54Z5R9FV Where would I put the @Double for example?
19:12:11 <jean-paul[m]> ghc seems to think it is exported, though
19:12:58 <sm> finding what's available to use in a megaparsec parser is not simple alas
19:13:03 <byorgey> hmm, interesting, maybe I was confused. If it works for you, then great
19:13:41 <byorgey> gensyst: computeSummary @Double thing should work
19:14:04 <gensyst> byorgey, doesn't
19:14:22 <byorgey> wait, no, sorry
19:14:22 × varoo quits (~varoo@122.161.91.19) (Read error: Connection reset by peer)
19:15:16 <geekosaur> doesn't that want to be `x :: Double; x = …`
19:15:30 <byorgey> gensyst: what is the purpose of quantifying over f in the instance for HasSummary Thing?
19:15:37 varoo joins (~varoo@122.161.91.19)
19:15:47 oldfashionedcow joins (~Rahul_San@user/oldfashionedcow)
19:15:48 <byorgey> why not just complexity :: Double = ... ?
19:16:09 <byorgey> geekosaur: x is not the problem, that definition has type Double since computeSummary returns a Double
19:16:15 <byorgey> s/definition/definitely/
19:16:42 <byorgey> the problem is that the instance for HasSummary Thing contains an ambiguous type
19:16:45 <gensyst> byorgey, for Thing (unlike for some other instances of HasSummary), the computeSummary is particularly complex - and I don't want to hardcode Double. I want to try running it first with Double and later with BigFloat, and so son.
19:16:58 <gensyst> but it's only for the internal use
19:17:33 <geekosaur> that "internal" means you have no control over it
19:17:52 × son0p quits (~ff@181.136.122.143) (Ping timeout: 248 seconds)
19:18:33 <gensyst> anyway what's the point of the forall feature for instances, if I can't even use it?
19:18:46 <byorgey> sure, if it's only for internal use then it shouldn't be in the instance head like that
19:18:48 <geekosaur> if you want to be able to swap it, use a type alias
19:18:50 <byorgey> what about this? https://dpaste.com/36LXV7TPX
19:19:27 × jero98772 quits (~jero98772@2800:484:1d80:d8ce:9815:cfda:3661:17bb) (Ping timeout: 248 seconds)
19:19:39 <byorgey> so the implementation of complexity has a polymorphic type, to make sure that you don't use Double-specific features. You only specialize it to Double in one place, so you can easily try out different types later.
19:19:46 <byorgey> but none of this leaks out of the instance.
19:20:29 <cheater> how can i force cabal to build a package (eg lens) without adding it to the cabal file?
19:20:55 <geekosaur> --build-depends=pkg
19:21:11 <geekosaur> but I'd have to question why you would do this
19:23:29 <kuribas> I was reviewing Python code with a new colleage, and I mentioned FP. She then told me she got a distaste of FP by working in a complex scala project.
19:24:01 <kuribas> My other colleage also went to clojure from scala, and got a hate for static types. I wonder if there is a pattern here. I read only about another scala programmer that did this.
19:24:16 <kuribas> I never hear from people going from haskell to clojure or dynamic languages.
19:25:27 <geekosaur> seems like I have heard a decent amount of that in -offtopic 🙂
19:26:41 <kuribas> yeah
19:29:22 <kuribas> kind of sad that scala is ruining static typed FP for people.
19:29:53 × kuribas quits (~user@ptr-17d51enb5ebo8t8l3i4.18120a2.ip6.access.telenet.be) (Quit: ERC (IRC client for Emacs 27.1))
19:30:51 <cheater> geekosaur: didn't you use to be able to just do "cabal build lens"?
19:31:22 <geekosaur> you may be thinking of cabal v1, which could create big messes that way
19:31:37 <geekosaur> there's still a way to do it but if it breaks you get to keep all the pieces
19:31:45 <geekosaur> cabal install --lib lens
19:31:55 <cheater> why would something break?
19:32:15 <geekosaur> multiple versions installed invites ghc to pick the wrong one
19:32:50 <geekosaur> we left cabal v1 behind for a reason. see "cabal hell", which this more or less re-invites
19:33:13 <cheater> k
19:33:20 <cheater> anyways,
19:34:01 <cheater> i'm looking for a network comms lib of some sort, to have a server running on a port or listening on a socket file. receive messages, send messages. that kind of thing.
19:34:14 <cheater> when a message is received it's given to a handler.
19:34:26 <cheater> i thought of using some http server library but it seems overkill.
19:35:04 <monochrom> I think C++ and Java discouraged a lot of people from static typing too, out of the gross verbosity. I imagine Scala merely inherits the same issue.
19:35:37 <cheater> i only used scala years and years ago and since then haven't had to
19:35:45 <cheater> i remember a lot of pain
19:35:46 <jean-paul[m]> cheater: HTTP servers are a dime a dozen, I wouldn't worry about wasting one on a too-small project
19:35:53 <monochrom> To be sure, I'm cold-hearted and unsympathetic. Clearly and logically, "static typing or else untyped" is a false dichotomy, i.e., ever heard of type inference?
19:36:19 <cheater> jean-paul[m]: yeah but i just would like to try something that's tcp and doesn't use http.
19:37:22 <monochrom> To be sure, subtyping and type inference don't mix very well. OCaml shows the best effort known, and it shows that there are limits. Although, in practice it needs very minimal type annotations.
19:37:45 <jean-paul[m]> cheater: Oh, ok. Well, try what you want. Just responding to the reason you gave - "overkill".
19:37:54 <monochrom> And very sensible ones.
19:38:11 <cheater> the only ocaml projects i worked on (like tezos) fully forbid the "o" part
19:38:31 <cheater> jean-paul[m]: i don't know any such libraries so i came here to ask.
19:38:34 <jean-paul[m]> is basement's wordToInt safe? Does every Word fit in an Int? Word says it is "the same size as an Int" but Int is signed. Is it "the same size" in memory or is it "the same size" for the number of values it can hold?
19:38:52 <monochrom> Now let's wait another 5 years to see people to saying "I switched from Rust to Racket because I'm tired of static typing". >:)
19:39:24 <monochrom> "oh and also tired of static ownership systems" >:D
19:39:25 <jean-paul[m]> cheater: protobufs, capnproto, messagepack
19:39:29 <cheater> making my programs not buggy is so limiting
19:39:37 <cheater> right, that rings a bell
19:39:40 <cheater> i've used those in the past
19:39:43 <cheater> let me try them then
19:39:44 <cheater> thanks
19:40:00 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba)
19:40:01 monochrom switched from Rust to Haskell because tired of that, actually LOL
19:40:09 <cheater> static ownership is terrible. i'm all for redistribution of wealth
19:40:59 <cheater> rust is pretty bad too. you want to keep your guillotine in good shape
19:42:17 <varoo> cheater: why is rust bad exactly?
19:42:26 × yrlnry quits (~yrlnry@2600:4040:738e:5400:14e9:d2e1:808a:60f2) (Remote host closed the connection)
19:42:28 <jean-paul[m]> Okay ... answered it myself. wordToInt 18446744073709551615 == -1
19:43:15 yrlnry joins (~yrlnry@pool-108-36-173-41.phlapa.fios.verizon.net)
19:43:23 <jean-paul[m]> why does Basement offer me a dedicated conversion between two types that wraps on overflow, don't I already have plenty of functions for that
19:43:26 <geekosaur> right, there's no magical way it can stretch an Int to hold a maximal-value Word
19:43:45 <geekosaur> it would need to use Int128
19:44:15 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba) (Ping timeout: 252 seconds)
19:45:53 <monochrom> You should ask the author of Basement.
19:46:17 Tuplanolla joins (~Tuplanoll@91-159-68-152.elisa-laajakaista.fi)
19:46:54 <monochrom> For overflow guarding, https://hackage.haskell.org/package/int-cast helps.
19:46:57 jero98772 joins (~jero98772@2800:484:1d80:d8ce:2a22:c4e3:dc8b:e5c2)
19:47:04 <dminuoso> That library should be part of base.
19:47:51 <dminuoso> Touting type safety but forcing people to just fromIntegral + realToFrac everywhere is a bit of a joke.
19:48:08 <dminuoso> I think the numerical system is perhaps one of the larger warts of Haskell.
19:49:22 <cheater> varoo: it dulls the edge
19:50:04 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba)
19:50:05 <[exa]> cheater: that's on point, I'm writing that down
19:50:25 <gensyst> This is what I have right now: https://dpaste.com/6WUZBUSUH
19:50:31 <cheater> don't lose your head over it
19:50:33 <gensyst> Is it possible to avoid Proxy?
19:50:55 × jle` quits (~jle`@cpe-23-240-75-236.socal.res.rr.com) (Ping timeout: 248 seconds)
19:50:57 <gensyst> cc geekosaur byorgey ^ that's more what i was after. i could do it with proxy
19:52:52 <jean-paul[m]> monochrom, geekosaur : thanks
19:52:57 jle` joins (~jle`@cpe-23-240-75-236.socal.res.rr.com)
19:53:22 <geekosaur> in some future version of ghc (or it might already be in 9.4 or 9.6 alpha2?) you would be able to declare it as `forall f -> a -> Double` and call it as `computeSummary Double thing`
19:54:05 <gensyst> interesting. geekosaur so this is sort of a case where TypeApplications just don't work and Proxy are still needed?
19:54:14 danza joins (~francesco@151.43.92.170)
19:54:50 <merijn> Define needed
19:54:56 <merijn> dminuoso: words
19:54:59 <geekosaur> right, because there's no exposed way to do a TypeApplication (except `Proxy @Double` which is not much better than what you're doing)
19:55:00 <merijn> *word
19:55:04 × mei quits (~mei@user/mei) (Remote host closed the connection)
19:55:10 <jackdk> You can turn on AllowAmbiguousTypes, make `f` the first param in your typeclass, and use type applications at the use site. I did this in my example last night.
19:55:21 <cheater> i think msgpack + msgpack-rpc is what i want
19:55:32 titibandit1 joins (~titibandi@xdsl-85-197-0-96.nc.de)
19:56:13 <monochrom> You need either Proxy or TypeApplication.
19:56:35 <monochrom> Speaking of type inference being limited in the face of subtyping heh.
19:56:51 <monochrom> And the ensuing "I hate static typing now" emotions >:)
19:58:35 <cheater> hmm, i created a new cabal package, added msgpack-rps to build-depends on Main.hs, and it can't resolve dependencies... any idea why that's happening? it's a completely new cabal project.
19:58:38 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
19:59:00 <gensyst> jackdk, it works lol
19:59:28 <cheater> oh, msgpack-rpc requires base < 4.13
19:59:29 <cheater> idk why
19:59:32 <cheater> it's weird
19:59:38 <gensyst> https://dpaste.com/CMNCJ4FP8
20:00:14 <cheater> how do i make cabal work with an older base? (and i assume i need an older ghc for that too)
20:00:24 <cheater> i installed cabal from the haskell-platform package in mate
20:00:24 × kurbus quits (~kurbus@user/kurbus) (Quit: Client closed)
20:01:01 mei joins (~mei@user/mei)
20:01:14 <cheater> ubuntu-mate that is
20:01:14 × danza quits (~francesco@151.43.92.170) (Read error: Connection reset by peer)
20:01:18 kurbus joins (~kurbus@user/kurbus)
20:02:14 <monochrom> Yes absolutely older GHC.
20:02:17 CiaoSen joins (~Jura@p200300c9573284002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
20:02:28 <sclv> its not about the version of cabal. its the version of ghc. if a package requires an older version of base, you need to use a ghc that provides that version of base
20:02:59 <monochrom> But older than what ubuntu-mate provides? Then you'll be better off uninstalling ubuntu-mate's GHC and use ghcup and choose your GHC version instead.
20:03:17 <merijn> Does ghcup even have versions old enough for base 4.13? :p
20:03:42 <cheater> how do i get that?
20:03:48 <cheater> i've never used ghcup
20:03:59 <tomsmeding> merijn: 4.13 is only ghc 8.8.4, that's recent-ish
20:04:01 <cheater> let me google...
20:04:02 <merijn> cheater: ghcup should be in ubuntu's distro
20:04:03 <sclv> alternately there's a newer and more maintained fork https://hackage.haskell.org/package/msgpack-rpc-conduit
20:04:04 <monochrom> And yeah cabal doesn't have a say on this.
20:04:08 <merijn> tomsmeding: <4.13 means 8.6, though
20:04:13 <tomsmeding> oh <
20:04:19 <sclv> installing an older ghc to use an older unmaintained package is usually a bad idea
20:04:33 × titibandit1 quits (~titibandi@xdsl-85-197-0-96.nc.de) (Remote host closed the connection)
20:04:38 <cheater> it's not in mate's repisitory
20:04:38 <sclv> because the rest of the ecosystem is splat. so you either use a newer fork of the package or update the package yourself
20:04:42 <cheater> 8.6 is ancient
20:04:43 <merijn> And I'm hitting the fact that some people cut support for 8.10 from megaparsec >.<
20:04:46 <tomsmeding> but in any case my ghcup goes back to ghc 7.10.3 :)
20:04:46 <monochrom> Yeah please don't save a sunk ship.
20:04:54 <tomsmeding> cheater: https://www.haskell.org/ghcup/
20:05:11 <sclv> i highly recommend not trying to use an older unmaintained package off the shelf. either update it yourself and use your locally updated fork, or use the newer fork already released on hackage
20:05:11 <cheater> why is msgpack-rpc with ancient ghc
20:05:20 <sclv> because its an old package that is unmaintained
20:05:26 <sclv> it was last uploaded in 2015!
20:05:34 <sclv> its like eight years out of date
20:05:50 <merijn> Hell, even the last metadata revision is from 2019, i.e. 4 years ago
20:06:22 <monochrom> I would give --allow-newer a try. If it works or almost works (trivial errors I can fix quickly), then cool. If not, I would just give up and forget it.
20:07:17 <cheater> oh i forgot about that
20:07:19 <cheater> i'll try that
20:07:24 <merijn> monochrom: Yes, but you have given up on being unreasonable ;)
20:08:04 <merijn> Meanwhile I just spent my afternoon reading changelogs for 77 dependencies to see if I can bump my bounds after not checking them for 3+ years :p
20:08:08 <cheater> there should be like an allow-new override per-package in the cabal file
20:08:17 <tomsmeding> merijn: F
20:08:17 <merijn> cheater: there is...
20:08:24 <cheater> how does it work?
20:08:26 <geekosaur> cabal.project at least
20:08:38 <tomsmeding> https://cabal.readthedocs.io/en/3.4/cabal-project.html#cfg-field-allow-newer
20:09:04 × freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds)
20:09:18 × gensyst quits (gensyst@user/gensyst) (Quit: Leaving)
20:09:24 <monochrom> merijn: BTW "ghcup list" lists the relation between GHC versions and base versions too.
20:09:27 <geekosaur> --allow-newer is also per package, if you look at the usage
20:09:27 <tomsmeding> mind that this is the cabal.project file, which is _distinct_ from your something.cabal file
20:09:51 <merijn> monochrom: I'm a grumpy old curmudgeon who doesn't have ghcup installed :p
20:09:55 <tomsmeding> minimal cabal.project is "packages: ."
20:10:16 <merijn> tomsmeding: minimal cabal.project is no file ;)
20:10:23 son0p joins (~ff@181.136.122.143)
20:10:33 <tomsmeding> sure, but what I wrote is minimal contents if you want the file
20:10:38 <merijn> oh, fun times, people uploading broken code to hackage
20:10:41 <tomsmeding> point being that an empty cabal.project isn't going to work
20:10:45 <monochrom> "semantically minimal after syntax desugaring" >:)
20:10:53 <tomsmeding> and it's quite unclear from docs what the _actual_ minimal contents is
20:11:01 <merijn> "variable not in scope: when"
20:11:53 <geekosaur> @index when
20:11:53 <lambdabot> Control.Monad
20:12:22 <merijn> geekosaur: I know that, but that doesn't fix this code on hackage so my build plan works
20:12:51 <tomsmeding> code on hackage that uses 'when' without importing Control.Monad? Has there even been a base where 'when' was in Prelude
20:12:59 <merijn> Me and my unreasonable expectation people try and at least "compile" before uploading
20:13:01 <monochrom> I think no.
20:13:11 <cheater> hmm can i make something make a cabal.project for me just like i can make cabal make the .cabal file for me?
20:13:26 <monochrom> Ugh cabal doesn't make .cabal files.
20:13:31 <tomsmeding> cheater: open an editor, type "packages: .", save, close
20:13:34 <geekosaur> cabal init does
20:13:39 <monochrom> Ah sorry.
20:13:40 × szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
20:13:41 <geekosaur> but not cabal.project
20:13:44 <cheater> that's too much to remember that
20:13:48 <jackdk> There's a good chance that the package is unmaintained and and allow-newer on that base bound will let it compile
20:13:55 <tomsmeding> cheater: I know, but there's no better currently
20:14:24 <merijn> geekosaur: You can just do "cabal configure" and copy cabal.project.local to cabal.project
20:14:39 <merijn> cheater: ^^
20:14:46 <tomsmeding> cheater: example file, you'll only need the 'packages' and the 'allow-newer' (with your deps) https://git.tomsmeding.com/mandelhs/tree/cabal.project
20:15:13 <cheater> i won't remember the url
20:15:18 <geekosaur> I don't even use cabal init, I copy shit from existing projects
20:15:24 <merijn> geekosaur: same
20:15:31 <tomsmeding> same
20:15:37 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba) (Remote host closed the connection)
20:15:53 <tomsmeding> at some point you start remembering certain template projects that have suitable .cabal files to copy
20:16:12 <merijn> anyone know a library that provides a weighted random shuffle function?
20:16:24 <monochrom> I still use cabal init, but with version 3.8 adding -Wall religiously, I am slowly getting discouraged.
20:16:27 <merijn> I used to use random-extras, but the last version is from 2012 and breaks
20:16:53 freeside joins (~mengwong@103.252.202.170)
20:17:41 <tomsmeding> merijn: and you can't lift out the one function you need?
20:18:52 <merijn> tomsmeding: not without essentially vendoring the entire thing
20:19:04 <merijn> And this is some "absolute least amount of work" task
20:20:20 <tomsmeding> oh I see it brings in a whole lot of stuff
20:21:24 <dminuoso> Mmm. Okay, haskell.nix is really a sweet way to deal with haskell.
20:21:39 some02 is now known as sudden
20:21:54 <dminuoso> So I just had the idea how to restructure CI - and just started using the nixos test library to just execute haskell tests
20:22:00 <merijn> tomsmeding: Well, also, I can't be arsed investing even a tiny amount of effort :p
20:22:27 <dminuoso> https://gist.github.com/dminuoso/7a51d818b97d2c60c3099637807164c8
20:22:30 <merijn> Especially since the entire point is to largely replace this code
20:22:32 <dminuoso> This is far less oppressive than docker.
20:22:40 <merijn> anyway, I give up for now
20:22:40 trev joins (~trev@user/trev)
20:23:57 ddellacosta joins (~ddellacos@143.244.47.100)
20:27:53 × merijn quits (~merijn@86.86.29.250) (Ping timeout: 252 seconds)
20:34:23 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
20:36:02 <cheater> tomsmeding: my problem is that cabal init will add all the stuff i might want to use. and it'll be commented etc. i want cabal to make a cabal.project file like that too.
20:36:38 <tomsmeding> cheater: I see, I guess you can use my link as an example :p
20:36:46 <tomsmeding> I'm not aware of any such generator for cabal.project files
20:36:54 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
20:37:01 <tomsmeding> also there's a shit ton of keys for that file so listing them all would be counterproductive
20:37:46 <tomsmeding> more productive is to search on that documentation page ( https://cabal.readthedocs.io/en/3.4/cabal-project.html ) for anything that comes up that you'd want to configure
20:38:00 × kurbus quits (~kurbus@user/kurbus) (Quit: Client closed)
20:40:31 × king_gs quits (~Thunderbi@2806:103e:29:34e5:ecc6:ec8d:1c5b:35a6) (Remote host closed the connection)
20:40:51 king_gs joins (~Thunderbi@2806:103e:29:34e5:ecc6:ec8d:1c5b:35a6)
20:41:58 × trev quits (~trev@user/trev) (Remote host closed the connection)
20:49:02 Lycurgus joins (~juan@user/Lycurgus)
20:53:46 coot joins (~coot@213.134.171.3)
20:54:32 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
21:03:01 <MangoIV[m]> Hi, I'm wondering why `($)` is not fully levity polymorphic:... (full message at <https://libera.ems.host/_matrix/media/v3/download/libera.chat/3ea06772c617aaeb5a2e74b9e3c2a6b8dfed09d9>)
21:03:08 <MangoIV[m]> * Hi, I'm wondering why `($)` is not fully levity polymorphic:... (full message at <https://libera.ems.host/_matrix/media/v3/download/libera.chat/d96199568d292ee1612e8a63101e895b992a2dcc>)
21:03:28 <MangoIV[m]> * Hi, I'm wondering why `($)` is not fully levity polymorphic:... (full message at <https://libera.ems.host/_matrix/media/v3/download/libera.chat/e0eddaffe744a38b6a26d5928a0abf3183e09b40>)
21:05:24 <geekosaur> levity polymorphism turns out to be hard
21:06:14 × Lycurgus quits (~juan@user/Lycurgus) (Quit: Exeunt: personae.ai-integration.biz)
21:06:41 <geekosaur> also, please don't use matrix edits over IRC. https://imgur.com/CFJD68B.png
21:07:50 aquoot joins (~aquoot@132.170.212.60)
21:09:45 <geekosaur> https://downloads.haskell.org/~ghc/9.2.1-alpha1/docs/html/users_guide/exts/levity_polymorphism.html#no-levity-polymorphic-variables-or-arguments
21:10:22 gurkenglas joins (~gurkengla@dynamic-046-114-176-228.46.114.pool.telefonica.de)
21:10:46 <geekosaur> I think that's the main showstopper
21:12:50 <MangoIV[m]> geekosaur: this doesn't explain the latter implementation is wrong; my fully levity polymorphic $ compiles and works. it's just eta reduced
21:13:56 <MangoIV[m]> <geekosaur> "also, please don't use matrix..." <- Sorry, I'm bridging to IRC.
21:14:15 <geekosaur> yes, I know. matrix edits suck over the bridge
21:15:23 <MangoIV[m]> again; this code compiles and works:... (full message at <https://libera.ems.host/_matrix/media/v3/download/libera.chat/7f1766e9f465b363afef78f393e0c25e87135141>)
21:15:53 <davean> Edits in an interactive medium just suck because they cause confusion for people who are interacting.
21:16:06 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba)
21:16:26 <geekosaur> MangoIV[m], does it also handle impredicativity?
21:16:34 × aquoot quits (~aquoot@132.170.212.60) (Quit: Leaving)
21:16:51 <geekosaur> one requirement for `$` is that `runST $ …` works
21:17:36 <geekosaur> and I think there needs to be some "hook" for the compiler to recognize it and always turn on `ImpredicativeTypes`
21:18:13 <MangoIV[m]> geekosaur: how is impredicativity handled? Isn't that magic that is specific to `($)` that I cannot replicate in my own implementation of `($)`?
21:18:13 <MangoIV[m]> (Btw, I've voiced that exact concern already )
21:18:32 <geekosaur> (which is kinda sucky but better than how it used to be done: recognized in the AST and removed from it so the question never came up)
21:18:36 × jespada quits (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) (Remote host closed the connection)
21:19:13 jespada joins (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net)
21:19:18 <geekosaur> it's not specific to `($)` except insofar as there's that hack to force it to always be impredicative
21:19:47 <MangoIV[m]> it works with ImpredicativeTypes and runST, so no worries there.
21:19:52 <davean> ttps://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/impredicative_types.html
21:20:06 geekosaur hands davean an h
21:20:19 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:1805:fe0d:6c6e:4fba) (Ping timeout: 252 seconds)
21:20:23 × freeside quits (~mengwong@103.252.202.170) (Ping timeout: 252 seconds)
21:20:28 × bgs quits (~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection)
21:20:53 freeside joins (~mengwong@103.252.202.170)
21:20:57 × beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Read error: Connection reset by peer)
21:21:06 <geekosaur> MangoIV[m], right, the trick is it should work without `ImpredicativeTypes` turned on, because people expect it to 😕
21:21:09 beteigeuze1 joins (~Thunderbi@bl14-81-220.dsl.telepac.pt)
21:21:37 <geekosaur> even though it requires impredicativity
21:21:37 <c_wraith> I often wonder if we should be able to tag definitions as Impredicative, rather than usage.
21:21:54 <davean> geekosaur: people's expectations should change - as should the language.
21:21:58 <MangoIV[m]> geekosaur: yeah, this is the magic that ghc inserts, but that doesn't matter for my case, I cannot have ghc magic in my own implementation; but that means that the implementation of `($)` in GHC is indeed not as polymorphic as it could be
21:22:47 <geekosaur> then your question is probably best addressed to the libraries list or possibly the ghc list (but I'd start with libraries@)
21:23:27 beteigeuze1 is now known as beteigeuze
21:23:53 mikko joins (~mikko@user/mikko)
21:24:43 pavonia joins (~user@user/siracusa)
21:24:49 <davean> There are a lot of tricky problems that come up with levity
21:25:23 <mikko> i would like to start my first haskell project and use the ansi-terminal package for it, however i can't figure out how to install it
21:25:32 schum joins (~schum@2001:470:69fc:105::38e0)
21:25:59 × freeside quits (~mengwong@103.252.202.170) (Ping timeout: 268 seconds)
21:26:04 <mikko> i have initialized a project using cabal and followed cabal's getting started guide which worked fine but when i try to install ansi-terminal instead of haskell-say i get errors
21:26:30 <c_wraith> well.. what OS are you on, and what are the errors?
21:26:45 <geekosaur> @where paste
21:26:45 <lambdabot> Help us help you: please paste full code, input and/or output at e.g. https://paste.tomsmeding.com
21:26:47 <mikko> https://bpa.st/TREQW
21:27:13 <mikko> i'm on opensuse tumbleweed, using ghcup
21:27:29 <c_wraith> that looks like your project's cabal file is specifying a really old version of base
21:27:39 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
21:27:50 schum parts (~schum@2001:470:69fc:105::38e0) ()
21:27:57 <mikko> is there a way to just install whatever works? i don't really care what version it uses
21:28:21 <mikko> i don't think i'm using anything from base myself since it's just printing hello world
21:28:31 <c_wraith> base includes print. and putStrLn
21:28:47 <c_wraith> Anyway, just change the constraint on base to something like <5
21:28:58 <c_wraith> that's sort of a lie, but it'll work for your current needs
21:30:16 <mikko> thanks, that seems to work
21:30:34 <mikko> how do i work around if another dependency needs a different version of base?
21:30:47 <c_wraith> Well, you can't change versions of base. It's closely tied to your version of GHC.
21:31:56 <c_wraith> Your options are essentially changing what version of GHC you're using or telling cabal it's ok to ignore the version bound on base.
21:32:33 × mechap quits (~mechap@user/mechap) (Quit: WeeChat 3.8)
21:32:49 <c_wraith> the latter is done with the --allow-newer flag, in a command like cabal configure --allow-newer=base
21:33:18 <mikko> i was thinking of using relude but it says base has to be <4.17
21:33:35 <c_wraith> relude actually might care. It's pretty intensive
21:33:55 <davean> mikko: relude still uses base
21:34:13 <mikko> so there's no way to use these packages together?
21:34:26 <c_wraith> well, you can see if it compiles if you tell it to allow newer
21:34:34 <c_wraith> But it isn't a tested configuration
21:34:48 <mikko> that sounds scary :D
21:35:21 <c_wraith> Fortunately, *most* ways it can go wrong will fail to compile
21:37:49 <davean> mikko: to be clear, 'base', at a slightly wrong and high level but appropriate to most programmers, is how you interface with the compiler
21:37:57 × bontaq quits (~user@ool-45779fe5.dyn.optonline.net) (Remote host closed the connection)
21:38:24 <davean> If you use Int, thats Base, if you use Char, thats base, if you use String, thats base
21:38:45 <davean> ALMOST anything you do, is base because the compiler interacts with it. Again, not quite true, but true enough for now
21:38:51 <mikko> i see
21:38:58 <c_wraith> Hmm. base 4.17 is specific to ghc 9.4. The updates to base for 4.17 are probably quite small. It'll probably work.
21:41:14 <cheater> hmm... any suggestions? https://pastebin.com/ste022vr
21:41:36 <cheater> any modern alternatives to msgpack-rpc?
21:41:51 <mikko> i can't get it to stop complaining about dependencies, i guess i'll stick to regular prelude so i can actually write some code finally
21:42:31 × zeenk quits (~zeenk@2a02:2f04:a014:8700::7fe) (Quit: Konversation terminated!)
21:43:05 <geekosaur> https://hackage.haskell.org/package/msgpack-rpc-conduit was suggested earlier
21:43:25 <MangoIV[m]> <geekosaur> "then your question is probably..." <- Thank you, I’ll have a look.
21:43:53 × gurkenglas quits (~gurkengla@dynamic-046-114-176-228.46.114.pool.telefonica.de) (Ping timeout: 246 seconds)
21:44:29 <cheater> oh was it? i must have missed that.
21:44:34 zeenk joins (~zeenk@2a02:2f04:a014:8700::7fe)
21:44:54 <cheater> curryer-rpc is recent, too
21:45:05 <cheater> but they're both early in development which kinda sucks
21:47:10 <cheater> https://hackage.haskell.org/package/msgpack-rpc-conduit-0.0.7/docs/Network-MessagePack-Server.html#g:3
21:47:11 <cheater> ....
21:47:13 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
21:47:40 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 252 seconds)
21:47:50 <cheater> i feel like i'm being punked
21:49:41 × zeenk quits (~zeenk@2a02:2f04:a014:8700::7fe) (Quit: Konversation terminated!)
21:50:00 Lord_of_Life_ is now known as Lord_of_Life
21:51:39 × malte quits (~malte@mal.tc) (Remote host closed the connection)
21:51:53 × zaquest quits (~notzaques@5.130.79.72) (Read error: Connection reset by peer)
21:51:58 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Quit: Lost terminal)
21:54:43 freeside joins (~mengwong@103.252.202.170)
21:58:12 × coot quits (~coot@213.134.171.3) (Quit: coot)
21:58:43 coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
21:59:02 malte joins (~malte@mal.tc)
22:01:05 szkl joins (uid110435@id-110435.uxbridge.irccloud.com)
22:01:32 <hololeap> there is a Set.map, so why isn't there a Set.traverse?
22:01:43 zmt01 joins (~zmt00@user/zmt00)
22:04:55 × mc47 quits (~mc47@xmonad/TheMC47) (Remote host closed the connection)
22:05:11 × swamp_ quits (~zmt00@user/zmt00) (Ping timeout: 255 seconds)
22:09:49 × king_gs quits (~Thunderbi@2806:103e:29:34e5:ecc6:ec8d:1c5b:35a6) (Ping timeout: 252 seconds)
22:14:34 <[Leary]> hololeap: Non-monotonic map/traverse are kinda pointless on Set. You might as well use `fmap S.fromList . traverse f . S.toList`. In fact, now that I look at the source, that's just how `S.map` is implemented.
22:23:58 × [Leary] quits (~Leary]@user/Leary/x-0910699) (Remote host closed the connection)
22:24:31 [Leary] joins (~Leary]@user/Leary/x-0910699)
22:26:49 random-jellyfish joins (~random-je@user/random-jellyfish)
22:30:01 × CiaoSen quits (~Jura@p200300c9573284002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
22:32:11 × akegalj quits (~akegalj@222-217.dsl.iskon.hr) (Quit: leaving)
22:37:27 waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7)
22:38:15 × oldfashionedcow quits (~Rahul_San@user/oldfashionedcow) (Ping timeout: 256 seconds)
22:39:23 oldfashionedcow joins (~Rahul_San@user/oldfashionedcow)
22:40:23 × califax quits (~califax@user/califx) (Ping timeout: 255 seconds)
22:42:11 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
22:42:11 × gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds)
22:43:25 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
22:43:32 × ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 255 seconds)
22:44:01 CiaoSen joins (~Jura@p200300c9573284002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
22:44:12 gmg joins (~user@user/gehmehgeh)
22:44:21 califax joins (~califax@user/califx)
22:44:30 × michalz quits (~michalz@185.246.207.221) (Remote host closed the connection)
22:44:33 × phma quits (~phma@host-67-44-208-33.hnremote.net) (Remote host closed the connection)
22:44:43 ec joins (~ec@gateway/tor-sasl/ec)
22:45:00 phma joins (~phma@host-67-44-208-33.hnremote.net)
22:48:18 × gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.8)
22:50:23 <hololeap> I think that makes sense
22:53:52 × coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
22:59:36 × johnw quits (~johnw@2600:1700:cf00:db0:f0d6:3852:1ef5:be75) (Quit: ZNC - http://znc.in)
23:00:15 × freeside quits (~mengwong@103.252.202.170) (Ping timeout: 248 seconds)
23:04:09 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
23:05:09 × phma quits (~phma@host-67-44-208-33.hnremote.net) (Read error: Connection reset by peer)
23:06:07 phma joins (~phma@2001:5b0:211f:3c78:58ef:9097:8d8f:e01b)
23:09:12 × Tuplanolla quits (~Tuplanoll@91-159-68-152.elisa-laajakaista.fi) (Quit: Leaving.)
23:12:28 freeside joins (~mengwong@103.252.202.170)
23:16:55 × freeside quits (~mengwong@103.252.202.170) (Ping timeout: 252 seconds)
23:20:12 × sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Quit: No Ping reply in 180 seconds.)
23:21:53 sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
23:22:06 freeside joins (~mengwong@103.252.202.170)
23:22:35 Guest75 joins (~Guest75@178.141.149.12)
23:24:37 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
23:31:04 × Alex_test quits (~al_test@178.34.160.79) (Ping timeout: 252 seconds)
23:31:37 × AlexZenon quits (~alzenon@178.34.160.79) (Ping timeout: 252 seconds)
23:34:52 × waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Quit: WeeChat 3.8)
23:35:17 Alex_test joins (~al_test@178.34.160.79)
23:35:22 × sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Quit: No Ping reply in 180 seconds.)
23:35:28 AlexZenon joins (~alzenon@178.34.160.79)
23:36:47 sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
23:36:51 waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7)
23:48:39 × varoo quits (~varoo@122.161.91.19) (Quit: Internet messed up)
23:52:03 × Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
23:52:41 dsrt^ joins (~dsrt@c-24-30-76-89.hsd1.ga.comcast.net)
23:52:50 <Inst__> huh
23:52:57 <Inst__> i'm surprised no one realized that Haskell is an excellent recession language
23:53:04 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 248 seconds)
23:53:08 <Inst__> +#1: get more done with less staff!
23:53:22 <Inst__> +#2: encourage non-productive coders to switch by switching to Haskell!
23:54:20 <monochrom> No, I'm surprised that you didn't realize that I realized.
23:57:36 Inst__ is now known as Inst

All times are in UTC on 2023-01-31.