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.