Logs on 2024-11-20 (liberachat/#haskell)
| 00:01:33 | → | mange joins (~user@user/mange) |
| 00:04:09 | × | Axman6 quits (~Axman6@user/axman6) (Ping timeout: 240 seconds) |
| 00:06:59 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 00:08:25 | × | Everything quits (~Everythin@46-133-188-81.mobile.vf-ua.net) (Quit: leaving) |
| 00:08:45 | × | acidjnk_new quits (~acidjnk@p200300d6e7283f33ad61be24cfbe8605.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
| 00:10:49 | × | misterfish quits (~misterfis@84.53.85.146) (Ping timeout: 260 seconds) |
| 00:19:50 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 272 seconds) |
| 00:20:38 | → | Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915) |
| 00:33:03 | × | sprotte24 quits (~sprotte24@p200300d16f3e1d0004a3986a39ff8486.dip0.t-ipconnect.de) (Read error: Connection reset by peer) |
| 00:36:25 | × | JuanDaugherty quits (~juan@user/JuanDaugherty) (Quit: JuanDaugherty) |
| 00:37:48 | → | Axman6 joins (~Axman6@user/axman6) |
| 00:40:16 | → | son0p joins (~ff@2800:e2:f80:ee7::4) |
| 00:40:16 | → | troojg joins (~troojg@user/troojg) |
| 00:43:41 | <hellwolf> | forM [ (s, n) | s <- [True, False], n <- [1..32] ] $ \(s, n) -> do |
| 00:43:41 | <hellwolf> | name <- TH.newName ((if s then "I" else "U") ++ show (n * 8)) |
| 00:43:41 | <hellwolf> | TH.tySynD name [] ((TH.conT ''INTx) |
| 00:43:41 | <hellwolf> | `TH.appT` (TH.promotedT (if s then 'True else 'False)) |
| 00:43:41 | <hellwolf> | `TH.appT` (TH.litT (TH.numTyLit n))) |
| 00:43:44 | <hellwolf> | This is amazing |
| 00:43:54 | <hellwolf> | Thanks for teaching me this today. |
| 00:45:14 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 00:53:30 | → | hsw_ joins (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) |
| 00:53:52 | × | hsw quits (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Read error: Connection reset by peer) |
| 00:58:00 | <Axman6> | if s then 'True else 'False made me sad but then realised it's not id |
| 00:58:44 | <Axman6> | hellwolf: why limit it to multiples of 8? We use a lot of 18 bit ints at work =) |
| 00:59:25 | <geekosaur> | pdp7? 😛 |
| 00:59:41 | <Axman6> | FPGAs |
| 00:59:57 | <geekosaur> | …everything old is new again |
| 01:00:06 | <Axman6> | the DSPs we have do 18x25 bit multiplications (IIRC) |
| 01:02:17 | <Axman6> | hellwolf: you might also want to look at how Clash does numbers |
| 01:03:29 | <hellwolf> | Yea, I wonder if there is better way of doing that 'True 'False thing :) I guess the domain I am dealing with spared me with non octal trite... |
| 01:03:44 | <hellwolf> | Axman6: yes I should checkout clash, heard a lot about it... |
| 01:05:07 | <Axman6> | I love it, I wish we'd use it at work, VHDL is such a horrific language |
| 01:16:44 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 244 seconds) |
| 01:17:48 | → | JuanDaugherty joins (~juan@user/JuanDaugherty) |
| 01:23:50 | × | housemate quits (~housemate@2a04:9dc0:0:162::5d91:d7ed) (Quit: Nothing to see here. I wasn't there.) |
| 01:30:36 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Remote host closed the connection) |
| 01:31:21 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 01:39:04 | × | Tuplanolla quits (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) (Quit: Leaving.) |
| 01:42:03 | → | Alleria_ joins (~Alleria@user/alleria) |
| 01:44:09 | × | Alleria quits (~Alleria@user/alleria) (Ping timeout: 252 seconds) |
| 01:55:12 | × | hsw_ quits (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Quit: Leaving) |
| 01:55:24 | → | hsw joins (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) |
| 01:59:18 | → | Alleria joins (~Alleria@user/alleria) |
| 02:03:04 | × | Alleria_ quits (~Alleria@user/alleria) (Ping timeout: 272 seconds) |
| 02:08:59 | × | gmg quits (~user@user/gehmehgeh) (Remote host closed the connection) |
| 02:09:12 | × | Alleria quits (~Alleria@user/alleria) (Ping timeout: 252 seconds) |
| 02:13:18 | → | gmg joins (~user@user/gehmehgeh) |
| 02:17:12 | × | JuanDaugherty quits (~juan@user/JuanDaugherty) (Quit: JuanDaugherty) |
| 02:23:22 | → | Alleria joins (~Alleria@user/alleria) |
| 02:30:18 | × | troojg quits (~troojg@user/troojg) (Ping timeout: 272 seconds) |
| 02:35:29 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 252 seconds) |
| 02:36:41 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 03:02:05 | <Axman6> | any python devs know of a python equivalent to insertWith max k v dict? |
| 03:13:59 | <edwardk> | hellwolf: re the export list, you can of course skip using an explicit export list. the least amount of code is no code at all there. |
| 03:14:00 | × | machinedgod quits (~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 252 seconds) |
| 03:15:45 | × | forell quits (~forell@user/forell) (Ping timeout: 276 seconds) |
| 03:23:16 | → | vanishingideal joins (~vanishing@user/vanishingideal) |
| 03:36:22 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 252 seconds) |
| 03:41:57 | → | rekahsoft joins (~rekahsoft@bras-base-orllon1103w-grc-06-76-69-85-220.dsl.bell.ca) |
| 03:43:47 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 03:47:48 | × | Alleria quits (~Alleria@user/alleria) (Remote host closed the connection) |
| 03:48:30 | → | Alleria joins (~Alleria@user/alleria) |
| 03:59:58 | × | Me-me quits (~me-me@user/me-me) (Quit: Disconnecting on purpose.) |
| 04:00:58 | → | Me-me joins (~me-me@kc.randomserver.name) |
| 04:26:27 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 04:28:04 | × | rekahsoft quits (~rekahsoft@bras-base-orllon1103w-grc-06-76-69-85-220.dsl.bell.ca) (Ping timeout: 252 seconds) |
| 05:08:39 | → | sand-witch_ joins (~m-mzmz6l@vmi833741.contaboserver.net) |
| 05:09:29 | × | sand-witch quits (~m-mzmz6l@vmi833741.contaboserver.net) (Ping timeout: 252 seconds) |
| 05:13:32 | sand-witch_ | is now known as sand-witch |
| 05:17:25 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 05:19:21 | × | ChaiTRex quits (~ChaiTRex@user/chaitrex) (Ping timeout: 260 seconds) |
| 05:19:23 | × | alphazone quits (~alphazone@2.219.56.221) (Ping timeout: 252 seconds) |
| 05:21:07 | → | ChaiTRex joins (~ChaiTRex@user/chaitrex) |
| 05:33:08 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 255 seconds) |
| 05:44:46 | → | michalz joins (~michalz@185.246.207.217) |
| 05:50:15 | → | statusbot joins (~statusbot@ec2-34-198-122-184.compute-1.amazonaws.com) |
| 05:53:51 | × | statusbot7 quits (~statusbot@ec2-34-198-122-184.compute-1.amazonaws.com) (Ping timeout: 252 seconds) |
| 05:57:50 | → | tt12310978324354 joins (~tt1231@syn-075-185-104-199.res.spectrum.com) |
| 05:58:39 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 260 seconds) |
| 05:59:13 | × | tt1231097832435 quits (~tt1231@2603:6010:8700:4a81:219f:50d3:618a:a6ee) (Ping timeout: 248 seconds) |
| 05:59:14 | tt12310978324354 | is now known as tt1231097832435 |
| 06:01:33 | × | anpad quits (~pandeyan@user/anpad) (Quit: ZNC 1.8.2 - https://znc.in) |
| 06:02:17 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 06:04:36 | → | alphazone joins (~alphazone@2.219.56.221) |
| 06:11:06 | × | ft quits (~ft@p4fc2a26f.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
| 06:12:48 | → | ft joins (~ft@p508dbc6e.dip0.t-ipconnect.de) |
| 06:14:58 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 245 seconds) |
| 06:16:37 | → | anpad joins (~pandeyan@user/anpad) |
| 06:19:36 | × | notzmv quits (~umar@user/notzmv) (Read error: Connection reset by peer) |
| 06:25:33 | × | mange quits (~user@user/mange) (Remote host closed the connection) |
| 06:26:05 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 06:30:03 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 06:33:31 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 06:36:15 | → | takuan joins (~takuan@178-116-218-225.access.telenet.be) |
| 06:39:49 | × | alphazone quits (~alphazone@2.219.56.221) (Ping timeout: 248 seconds) |
| 06:40:25 | → | ubert joins (~Thunderbi@178.115.41.15.wireless.dyn.drei.com) |
| 06:55:00 | → | acidjnk_new joins (~acidjnk@p200300d6e7283f43cc25887be993a47b.dip0.t-ipconnect.de) |
| 07:04:59 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 252 seconds) |
| 07:15:27 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 07:16:01 | × | zlqrvx quits (~zlqrvx@user/zlqrvx) (Quit: %quit%) |
| 07:16:46 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 07:17:21 | → | zlqrvx joins (~zlqrvx@user/zlqrvx) |
| 07:29:09 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 246 seconds) |
| 07:32:15 | <dminuoso> | bwe: The description is true, but not really relevant today. Mostly just a fun remark about history. |
| 07:33:28 | → | Square2 joins (~Square4@user/square) |
| 07:36:40 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 07:40:34 | × | caconym quits (~caconym@user/caconym) (Quit: bye) |
| 07:45:17 | → | sawilagar joins (~sawilagar@user/sawilagar) |
| 07:46:29 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 248 seconds) |
| 07:57:43 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 07:58:11 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 08:00:56 | × | olivial quits (~benjaminl@user/benjaminl) (Read error: Connection reset by peer) |
| 08:01:12 | → | olivial joins (~benjaminl@user/benjaminl) |
| 08:01:36 | × | GdeVolpiano quits (~GdeVolpia@user/GdeVolpiano) (Quit: WeeChat 4.4.2) |
| 08:04:24 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 252 seconds) |
| 08:07:18 | → | Perseverance joins (~Persevera@2.219.56.221) |
| 08:08:11 | <haskellbridge> | <hellwolf> edwardk: yes, that's true. |
| 08:08:11 | <haskellbridge> | ... long message truncated: https://kf8nh.com/_heisenbridge/media/kf8nh.com/lsAZXCpcYCpLcHAgzwCoIQAw/t5OqeCcG3NM (3 lines) |
| 08:10:18 | → | misterfish joins (~misterfis@84.53.85.146) |
| 08:14:56 | <haskellbridge> | <hellwolf> Also, if I take that thing in a separate module of its own, then I can be more comfortable letting module export list to be inexplicit. |
| 08:14:58 | <haskellbridge> | But now I am just splitting hairs. |
| 08:18:23 | → | xdej joins (~xdej@quatramaran.salle-s.org) |
| 08:18:28 | → | GdeVolpiano joins (~GdeVolpia@user/GdeVolpiano) |
| 08:19:21 | × | Perseverance quits (~Persevera@2.219.56.221) (Ping timeout: 252 seconds) |
| 08:21:52 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) |
| 08:28:40 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 244 seconds) |
| 08:31:40 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 08:36:37 | → | Perseverance joins (~Persevera@2.219.56.221) |
| 08:38:33 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 08:38:45 | → | euleritian joins (~euleritia@dynamic-176-006-132-236.176.6.pool.telefonica.de) |
| 08:39:06 | × | euleritian quits (~euleritia@dynamic-176-006-132-236.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 08:39:22 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 08:40:20 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 265 seconds) |
| 08:49:56 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 260 seconds) |
| 08:50:16 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 08:50:48 | × | GdeVolpiano quits (~GdeVolpia@user/GdeVolpiano) (Quit: WeeChat 4.4.2) |
| 08:51:26 | → | GdeVolpiano joins (~GdeVolpia@user/GdeVolpiano) |
| 08:53:20 | × | ft quits (~ft@p508dbc6e.dip0.t-ipconnect.de) (Quit: leaving) |
| 08:57:28 | <bwe> | dminuoso: then, what's the essence of it that's relevant today? |
| 08:57:37 | → | machinedgod joins (~machinedg@d108-173-18-100.abhsia.telus.net) |
| 08:58:17 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 08:58:44 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 09:03:35 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 09:03:48 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 09:06:21 | → | evocatus joins (~evocatus@2a02:a210:20c2:d600:1496:234e:dc9f:5868) |
| 09:08:11 | → | Smiles joins (uid551636@id-551636.lymington.irccloud.com) |
| 09:10:02 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 252 seconds) |
| 09:10:39 | × | evocatus quits (~evocatus@2a02:a210:20c2:d600:1496:234e:dc9f:5868) (Ping timeout: 246 seconds) |
| 09:16:38 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 09:17:18 | → | CrunchyFlakes joins (~CrunchyFl@ip1f13e94e.dynamic.kabel-deutschland.de) |
| 09:24:49 | → | Guest68 joins (~Guest68@2405:201:12:391a:c627:4da6:1387:26ef) |
| 09:25:15 | <Guest68> | @free showList :: (a -> String) -> [a] -> String |
| 09:25:15 | <lambdabot> | showList . (.) f = (.) (showList f) . $map |
| 09:27:12 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Quit: WeeChat 4.4.2) |
| 09:27:23 | <Guest68> | @free showList :: [a] -> String |
| 09:27:23 | <lambdabot> | showList = showList . $map f |
| 09:30:02 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 09:36:12 | <Guest68> | @free evaluate :: Expr a -> a |
| 09:36:12 | <lambdabot> | f . evaluate = evaluate . $map_Expr f |
| 09:37:04 | <[exa]> | Guest68: you may also do `/query lambdabot` and ask in private |
| 09:37:21 | <Guest68> | Oh, thank you. I'll try that. |
| 09:38:27 | <[exa]> | like, not a big issue, just that the attempts here get auto-streamed to at least 500 people :D |
| 09:40:55 | <kaol> | History question: Was there a time when Arrow just assumed arr used (->) instead of being a type class taking a Category? |
| 09:41:52 | <ncf> | what, like arr :: (b -> c) -> b -> c ? |
| 09:42:05 | <ncf> | there aren't many of those... |
| 09:43:31 | × | jespada quits (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) (Quit: Textual IRC Client: www.textualapp.com) |
| 09:46:06 | → | __monty__ joins (~toonn@user/toonn) |
| 09:46:07 | <kaol> | It could be that it's just that I had been introduced to arrows with a simple "arr is like lifting a function to it" and I didn't get the bigger picture then. |
| 09:48:59 | → | jespada joins (~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) |
| 09:50:00 | × | tzh quits (~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Quit: zzz) |
| 09:52:09 | → | mari-estel joins (~mari-este@user/mari-estel) |
| 09:54:11 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 09:54:11 | × | ChaiTRex quits (~ChaiTRex@user/chaitrex) (Read error: Connection reset by peer) |
| 09:54:12 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 09:54:28 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 09:54:34 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 09:54:41 | → | ChaiTRex joins (~ChaiTRex@user/chaitrex) |
| 09:57:18 | → | ljdarj joins (~Thunderbi@user/ljdarj) |
| 09:59:10 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 252 seconds) |
| 10:03:30 | × | mari-estel quits (~mari-este@user/mari-estel) (Quit: shitty teams) |
| 10:05:48 | → | chele joins (~chele@user/chele) |
| 10:07:32 | → | aforemny joins (~aforemny@i59F4C7F0.versanet.de) |
| 10:09:42 | → | ash3en joins (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) |
| 10:12:09 | → | lxsameer joins (~lxsameer@Serene/lxsameer) |
| 10:14:18 | × | aforemny quits (~aforemny@i59F4C7F0.versanet.de) (Ping timeout: 252 seconds) |
| 10:14:21 | → | aforemny_ joins (~aforemny@2001:9e8:6cf0:9800:3be1:8adc:eacb:81a7) |
| 10:14:30 | × | Guest68 quits (~Guest68@2405:201:12:391a:c627:4da6:1387:26ef) (Quit: Client closed) |
| 10:15:06 | <jackdk> | ISTR old versions of GHC shipping class Arrow without a superclass |
| 10:16:23 | <int-e> | ISTR old versions of GHC not shipping Arrow at all |
| 10:24:03 | → | mari-estel joins (~mari-este@user/mari-estel) |
| 10:24:45 | × | drdo quits (~drdo@bl9-110-63.dsl.telepac.pt) (Ping timeout: 276 seconds) |
| 10:29:58 | <jackdk> | You're probably thinking of even older versions |
| 10:32:10 | <kaol> | The first drafts of Haskell didn't have monads. |
| 10:35:48 | → | Guest25 joins (~Guest25@87-94-152-62.rev.dnainternet.fi) |
| 10:36:34 | × | Buliarous quits (~gypsydang@46.232.210.139) (Ping timeout: 252 seconds) |
| 10:36:56 | → | lortabac joins (~lortabac@37.171.105.2) |
| 10:38:20 | → | Buliarous joins (~gypsydang@46.232.210.139) |
| 10:40:21 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 10:40:56 | × | son0p quits (~ff@2800:e2:f80:ee7::4) (Ping timeout: 244 seconds) |
| 10:47:31 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 264 seconds) |
| 10:49:52 | → | pavonia joins (~user@user/siracusa) |
| 10:50:03 | × | acidjnk_new quits (~acidjnk@p200300d6e7283f43cc25887be993a47b.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
| 10:50:48 | × | lortabac quits (~lortabac@37.171.105.2) (Read error: Connection reset by peer) |
| 10:53:10 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 10:54:30 | → | drdo joins (~drdo@bl9-110-63.dsl.telepac.pt) |
| 11:00:51 | → | Guest68 joins (~Guest68@2405:201:12:391a:c627:4da6:1387:26ef) |
| 11:01:54 | × | Guest68 quits (~Guest68@2405:201:12:391a:c627:4da6:1387:26ef) (Client Quit) |
| 11:03:43 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 264 seconds) |
| 11:06:32 | × | hsw quits (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Remote host closed the connection) |
| 11:06:40 | → | hsw joins (~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) |
| 11:07:35 | × | Guest25 quits (~Guest25@87-94-152-62.rev.dnainternet.fi) (Ping timeout: 256 seconds) |
| 11:07:57 | → | acidjnk_new joins (~acidjnk@p200300d6e7283f43cc25887be993a47b.dip0.t-ipconnect.de) |
| 11:08:40 | → | mari97681 joins (~mari-este@user/mari-estel) |
| 11:10:22 | × | mari-estel quits (~mari-este@user/mari-estel) (Read error: Connection reset by peer) |
| 11:11:18 | → | mari-estel joins (~mari-este@user/mari-estel) |
| 11:13:47 | × | mari97681 quits (~mari-este@user/mari-estel) (Ping timeout: 255 seconds) |
| 11:19:37 | × | zlqrvx quits (~zlqrvx@user/zlqrvx) (Quit: %quit%) |
| 11:20:53 | → | zlqrvx joins (~zlqrvx@user/zlqrvx) |
| 11:21:00 | <probie> | kaol: Drafts? Monads are completely absent from 1.2. It's not until 1.3 they turn up |
| 11:30:07 | <kaol> | I was thinking in terms of anything before Haskell 98 being drafts. True, that's going a bit fast and loose. |
| 11:33:30 | × | zlqrvx quits (~zlqrvx@user/zlqrvx) (Quit: %quit%) |
| 11:33:57 | → | zlqrvx joins (~zlqrvx@user/zlqrvx) |
| 11:45:01 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 11:48:58 | <dminuoso> | bwe: Humor has never become irrelevant. :-) |
| 11:50:30 | <dminuoso> | kaol: Given that most haskellers are writing in non-standardized Haskell these days, it's all back to draft then. |
| 11:50:33 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 252 seconds) |
| 11:50:41 | <dminuoso> | A new Haskell standard is probably not coming. |
| 11:51:03 | <dminuoso> | Haskell2020 never succeeded. |
| 11:51:54 | → | jinsun joins (~jinsun@user/jinsun) |
| 11:52:42 | × | alp_ quits (~alp@2001:861:8ca0:4940:483b:a21e:7fb4:76cd) (Remote host closed the connection) |
| 11:52:59 | → | alp_ joins (~alp@2001:861:8ca0:4940:97d6:816b:8add:3996) |
| 11:53:04 | <mari-estel> | the age of standards is over. Now it is either: survive with your implementation or get a big company push their opinionated framework |
| 11:55:46 | <bwe> | dminuoso: so which way other than searching through github repos are we left with to learn and find the approaches to adopt for yourself? |
| 11:56:17 | <mari-estel> | let trained machines tell you how it is right |
| 12:05:14 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Read error: Connection reset by peer) |
| 12:06:09 | × | ethantwardy quits (user@user/ethantwardy) (Ping timeout: 260 seconds) |
| 12:10:38 | → | ethantwardy joins (user@user/ethantwardy) |
| 12:11:31 | × | alp_ quits (~alp@2001:861:8ca0:4940:97d6:816b:8add:3996) (Ping timeout: 252 seconds) |
| 12:13:11 | × | mari-estel quits (~mari-este@user/mari-estel) (Ping timeout: 255 seconds) |
| 12:19:58 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 245 seconds) |
| 12:20:53 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 12:21:50 | × | ash3en quits (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Quit: ash3en) |
| 12:21:50 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 12:22:55 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 12:27:00 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) |
| 12:32:00 | × | SlackCoder quits (~SlackCode@64-94-63-8.ip.weststar.net.ky) (Quit: Leaving) |
| 12:37:40 | × | acidjnk_new quits (~acidjnk@p200300d6e7283f43cc25887be993a47b.dip0.t-ipconnect.de) (Ping timeout: 272 seconds) |
| 12:37:53 | → | acidjnk_new joins (~acidjnk@p200300d6e7283f43b9a67790c51d38b0.dip0.t-ipconnect.de) |
| 12:40:27 | → | ljdarj1 joins (~Thunderbi@user/ljdarj) |
| 12:41:17 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 12:43:10 | → | alp_ joins (~alp@2001:861:8ca0:4940:f821:65d4:a88b:180b) |
| 12:44:25 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds) |
| 12:44:26 | ljdarj1 | is now known as ljdarj |
| 12:44:30 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 276 seconds) |
| 12:45:39 | → | ash3en joins (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) |
| 12:47:49 | × | ash3en quits (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Client Quit) |
| 12:53:41 | × | Fijxu quits (~Fijxu@user/fijxu) (Ping timeout: 255 seconds) |
| 12:57:22 | × | lxsameer quits (~lxsameer@Serene/lxsameer) (Ping timeout: 252 seconds) |
| 12:57:38 | × | TheCoffeMaker quits (~TheCoffeM@user/thecoffemaker) (Remote host closed the connection) |
| 13:00:06 | → | TheCoffeMaker joins (~TheCoffeM@user/thecoffemaker) |
| 13:01:01 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 13:02:53 | → | Digitteknohippie joins (~user@user/digit) |
| 13:03:01 | × | Digit quits (~user@user/digit) (Ping timeout: 244 seconds) |
| 13:10:35 | × | vanishingideal quits (~vanishing@user/vanishingideal) (Quit: leaving) |
| 13:14:31 | <bwe> | dminuoso: hm, constraint depends on dual which is now deprecated and there is a break using current GHC 9.10.1. |
| 13:15:28 | <bwe> | dminuoso: wait. It's weird. Why is GHC telling me that while hackage doesn't list dual as dependency? |
| 13:16:01 | <bwe> | ah, it's constraintS not constraint. |
| 13:27:22 | × | alp_ quits (~alp@2001:861:8ca0:4940:f821:65d4:a88b:180b) (Remote host closed the connection) |
| 13:27:39 | → | alp_ joins (~alp@2001:861:8ca0:4940:b086:6e29:f872:e211) |
| 13:28:42 | → | SlackCoder joins (~SlackCode@64-94-63-8.ip.weststar.net.ky) |
| 13:29:21 | → | mari-estel joins (~mari-este@user/mari-estel) |
| 13:29:34 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 260 seconds) |
| 13:35:45 | × | Pozyomka quits (~pyon@user/pyon) (Ping timeout: 248 seconds) |
| 13:36:45 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "") |
| 13:37:22 | × | alp_ quits (~alp@2001:861:8ca0:4940:b086:6e29:f872:e211) (Remote host closed the connection) |
| 13:37:39 | → | alp_ joins (~alp@2001:861:8ca0:4940:53c2:f590:3f4e:6591) |
| 13:43:07 | → | kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be) |
| 13:43:22 | → | euleritian joins (~euleritia@dynamic-176-003-034-243.176.3.pool.telefonica.de) |
| 13:44:34 | × | euleritian quits (~euleritia@dynamic-176-003-034-243.176.3.pool.telefonica.de) (Read error: Connection reset by peer) |
| 13:44:51 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 13:47:34 | → | Fijxu joins (~Fijxu@user/fijxu) |
| 13:54:56 | × | ubert quits (~Thunderbi@178.115.41.15.wireless.dyn.drei.com) (Ping timeout: 272 seconds) |
| 13:55:12 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 246 seconds) |
| 13:55:33 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 13:56:32 | → | weary-traveler joins (~user@user/user363627) |
| 13:58:03 | → | ubert joins (~Thunderbi@178.115.41.15.wireless.dyn.drei.com) |
| 14:02:47 | → | son0p joins (~ff@2800:e6:4001:6cc3:2748:5c2a:65d9:57ac) |
| 14:05:04 | → | Guest96 joins (~Guest96@2402:3a80:9e:5890:e83f:36b9:abb4:3cb8) |
| 14:05:17 | × | Guest96 quits (~Guest96@2402:3a80:9e:5890:e83f:36b9:abb4:3cb8) (Client Quit) |
| 14:07:39 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Quit: WeeChat 4.4.2) |
| 14:17:16 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 14:17:39 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 14:18:27 | → | CiaoSen joins (~Jura@2a05:5800:211:4200:ca4b:d6ff:fec1:99da) |
| 14:36:17 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 255 seconds) |
| 14:38:16 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 14:38:43 | × | CiaoSen quits (~Jura@2a05:5800:211:4200:ca4b:d6ff:fec1:99da) (Ping timeout: 245 seconds) |
| 14:41:27 | → | ljdarj1 joins (~Thunderbi@user/ljdarj) |
| 14:41:29 | → | lortabac joins (~lortabac@37.166.62.73) |
| 14:44:01 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 248 seconds) |
| 14:44:02 | ljdarj1 | is now known as ljdarj |
| 14:44:17 | → | divya joins (~user@139.5.11.231) |
| 14:49:50 | → | ash3en joins (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) |
| 14:51:35 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 255 seconds) |
| 14:51:47 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 14:55:26 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 14:56:17 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 14:57:37 | × | alp_ quits (~alp@2001:861:8ca0:4940:53c2:f590:3f4e:6591) (Ping timeout: 252 seconds) |
| 15:01:44 | × | Digitteknohippie quits (~user@user/digit) (Ping timeout: 260 seconds) |
| 15:11:35 | → | Digit joins (~user@user/digit) |
| 15:12:44 | × | SlackCoder quits (~SlackCode@64-94-63-8.ip.weststar.net.ky) (Quit: Leaving) |
| 15:26:13 | × | mari-estel quits (~mari-este@user/mari-estel) (Ping timeout: 252 seconds) |
| 15:34:22 | × | lortabac quits (~lortabac@37.166.62.73) (Ping timeout: 272 seconds) |
| 15:36:47 | → | mari-estel joins (~mari-este@user/mari-estel) |
| 15:37:37 | <bwe> | dminuoso: How close am I to the solution? https://paste.tomsmeding.com/kSbnWM3t |
| 15:39:47 | × | Angelz quits (Angelz@2605:6400:30:fc15:9bd1:2217:41cd:bb15) (Changing host) |
| 15:39:47 | → | Angelz joins (Angelz@user/angelz) |
| 15:40:20 | <dminuoso> | bwe: A bit far away. With constraints, instead of carrying a proxy around, you'd pass just a Dict around. |
| 15:40:34 | <dminuoso> | (I mean you could conceive situations where you might want both, too) |
| 15:48:14 | <bwe> | dminuoso: ok, so Dict replaces in my case simply Proxy. So, therefore also in the instances: https://play-haskell.tomsmeding.com/saved/zCSNq6hE |
| 15:48:47 | <dminuoso> | bwe: This looks still wrong, |
| 15:49:43 | <dminuoso> | withDict :: HasDict c e => e -> (c => r) -> r |
| 15:50:14 | <dminuoso> | So the idea is to use it like this: `withDict e (fromHTML html)` |
| 15:50:38 | <dminuoso> | fromHTML then does not take any Dict argument. |
| 15:50:44 | <dminuoso> | Imagine this: |
| 15:51:07 | <dminuoso> | :t fmap (+ (1 :: Int)) |
| 15:51:07 | <lambdabot> | Functor f => f Int -> f Int |
| 15:51:13 | <dminuoso> | Note that this function takes a constraint. |
| 15:51:30 | <bwe> | (c => r) |
| 15:51:52 | <dminuoso> | bwe: If you squint a bit, => is really not too different from -> |
| 15:52:22 | <dminuoso> | We can pretend the constraint to be a kind of argument that needs to be provided. |
| 15:52:34 | <dminuoso> | Except that GHC just automgically fills this, normally. |
| 15:52:56 | <dminuoso> | `constraints` gives you a way to reify a dictionary, pass it around, and then discharge a constraint with it. |
| 15:53:02 | <dminuoso> | by "discharge" I mean like function application. |
| 15:53:20 | <dminuoso> | take something that wants a dictionary, and stuff the dictionary in to satisfy everything. |
| 15:53:51 | → | SlackCoder joins (~SlackCode@208.26.70.132) |
| 15:54:04 | <bwe> | so, where do I stuff the dictionary? line 24 `fromDBEntry :: Dict (IntoGeneral a)` is that fine so far? |
| 15:54:50 | <dminuoso> | % class Foo where f :: Int |
| 15:54:50 | <yahb2> | <no output> |
| 15:54:53 | <dminuoso> | % :t f |
| 15:54:53 | <yahb2> | f :: Foo => Int |
| 15:55:02 | <dminuoso> | bwe: See this? |
| 15:55:17 | <dminuoso> | Or maybe this: |
| 15:55:27 | <dminuoso> | % class Foo a where f :: Int |
| 15:55:27 | <yahb2> | <interactive>:77:19: error: [GHC-39999] ; • Could not deduce ‘Foo a0’ ; from the context: Foo a ; bound by the type signature for: ; f :: forall {k} (a :: k). F... |
| 15:55:30 | <dminuoso> | % class Bar a where f :: Int |
| 15:55:30 | <yahb2> | <interactive>:79:19: error: [GHC-39999] ; • Could not deduce ‘Bar a0’ ; from the context: Bar a ; bound by the type signature for: ; f :: forall {k} (a :: k). B... |
| 15:56:58 | <bwe> | so the type instance does carry its class with it |
| 15:57:23 | <bwe> | so I actually put `Foo => Int` into `(c => r)` |
| 15:57:26 | <dminuoso> | % :set -XAllowAmbiguousTypes |
| 15:57:27 | <yahb2> | <no output> |
| 15:57:28 | <dminuoso> | % class Bar a where f :: Int |
| 15:57:28 | <yahb2> | <no output> |
| 15:57:30 | <dminuoso> | Here we go. |
| 15:57:33 | <dminuoso> | :t f |
| 15:57:34 | <lambdabot> | FromExpr a => a |
| 15:57:42 | <dminuoso> | % :t f |
| 15:57:42 | <yahb2> | f :: forall {k} (a :: k). Bar a => Int |
| 15:57:54 | <dminuoso> | bwe: Right. |
| 15:58:06 | <dminuoso> | bwe: Or in this case `Bar a => Int` |
| 15:58:20 | <bwe> | withDict :: e -> (Bar a => Int) -> Int |
| 15:58:31 | <dminuoso> | bwe: You can then use DataKinds to promote SiteVariant too, that way you dont need separate `SiteA` and `SiteB` types. |
| 15:58:32 | <bwe> | so what's `e` then? |
| 15:59:12 | <bwe> | dminuoso: first I want to grasp `withDict` :) |
| 15:59:13 | <dminuoso> | bwe: Lets pretend withDict :: Dict c -> (c => r) -> r |
| 15:59:18 | <dminuoso> | Which is the simpler form. |
| 15:59:33 | <dminuoso> | (And in fact there exists an instance that allows you to use it as such) |
| 16:00:11 | <dminuoso> | "Assuming we have a reified dictionary for constraint c, and some r that needs a dictionary c, this discharges the `c =>` constraint and gives you the r back. |
| 16:00:12 | <bwe> | withDict :: Dict (Bar a) -> (Bar a => Int) -> Int |
| 16:00:24 | <dminuoso> | Yup, thats it. |
| 16:01:10 | <bwe> | now it clicks. Dict __(Bar a) -> (__Bar a__ => Int) -> Int |
| 16:01:11 | <dminuoso> | bwe: Under the hood `C =>` becomes really just some sort of function argument that takes a some actual dictionary. |
| 16:01:36 | <dminuoso> | Except all that dictionary passing happens just invisibly and automatically under the hood. |
| 16:01:44 | <dminuoso> | With `constraints` you make it explicit and controllable |
| 16:01:45 | <bwe> | Whatever Dict carries, withDict discharges from the second argument |
| 16:01:56 | <dminuoso> | Exactly. Its really just like function application |
| 16:01:59 | <dminuoso> | :t ($) |
| 16:02:00 | <lambdabot> | (a -> b) -> a -> b |
| 16:02:05 | <dminuoso> | :t flip ($) |
| 16:02:06 | <lambdabot> | a -> (a -> c) -> c |
| 16:02:09 | <dminuoso> | Its pretty much the same thing. :) |
| 16:02:24 | <bwe> | so how to apply this now… |
| 16:03:15 | <dminuoso> | bwe: So first, get rid of SiteA and SiteB datatypes. |
| 16:03:33 | <dminuoso> | bwe: Then flip on DataKinds, this way you suddenly get these magic types `A` and `B` |
| 16:03:41 | <dminuoso> | % :set -XDataKinds |
| 16:03:41 | <yahb2> | <no output> |
| 16:03:52 | <dminuoso> | % data SiteVariant = SiteA | SiteB |
| 16:03:52 | <yahb2> | <no output> |
| 16:03:56 | <dminuoso> | % :k SiteA |
| 16:03:56 | <yahb2> | SiteA :: SiteVariant |
| 16:05:15 | <bwe> | https://play-haskell.tomsmeding.com/saved/M98rHWtW |
| 16:05:37 | <bwe> | is DataKinds just using the type as a type and not to carry its value? |
| 16:05:38 | → | alp_ joins (~alp@2001:861:8ca0:4940:fc9d:90cc:a5de:4f14) |
| 16:06:29 | <dminuoso> | bwe: DataKind promotes `SiteVariant` into a Kind, and conjures types `SiteA :: SiteVariant` and `SiteB :: SiteVariant` |
| 16:07:55 | <bwe> | (while `SiteA` and `SiteB` continue to exist on the data level, too) |
| 16:07:59 | <dminuoso> | Right. |
| 16:08:19 | <bwe> | ay, what's next? |
| 16:08:38 | <dminuoso> | So Im thinking maybe a HasDict instance. |
| 16:08:58 | <dminuoso> | This is all getting really strange, at the end. |
| 16:09:15 | <dminuoso> | Ultimately all you need is just `fromHTML :: SiteVariant -> ByteString -> General` of couerse. |
| 16:09:56 | <bwe> | but this will be no more instance but normal function, right? |
| 16:09:59 | <Square2> | I might get into the situation of making my department of 50 (12 devs) adapt Haskell. It's a bit scary tbh. How to onboard people who mostly programmed java past 15 years. |
| 16:10:07 | <dminuoso> | bwe: Right. |
| 16:10:50 | × | Alleria quits (~Alleria@user/alleria) (Quit: Textual IRC Client: www.textualapp.com) |
| 16:10:57 | <dminuoso> | Square2: Having onboarded a bunch of people onto Haskell, Id say it depends very much on the company culture and the people. |
| 16:11:35 | <dminuoso> | bwe: I think we just ended up on a fun journey about constraints due to an XY problem. ;) |
| 16:11:38 | <Square2> | dminuoso, Yeah, I feel it could be a uphill battle. Some are probably not up to it. |
| 16:11:43 | <bwe> | dminuoso: so we drop withDict or not? |
| 16:11:46 | <dminuoso> | Square2: Are they motivated to learn Haskell? |
| 16:11:54 | <dminuoso> | bwe: Hey, we're just exploring for fun, right? |
| 16:12:13 | <dminuoso> | You decide. :-) |
| 16:12:15 | <bwe> | dminuoso: I am just before that fun bit :). |
| 16:12:39 | <Square2> | dminuoso, Probably not. But most of them will just use it to write simple functions. All IO will remain in Java. |
| 16:13:12 | <dminuoso> | Square2: If they are hardcore Java developers, not motivated to learn Haskell... Im not sure this is going to end well. |
| 16:14:19 | <Square2> | dminuoso, I mean, they can probably see the motivation of using it. We're in a "there is no other way" situation. |
| 16:14:36 | <dminuoso> | You can only lead a horse to the water. |
| 16:14:43 | <bwe> | dminuoso: can we go back to complete the withDict first? I pretty much appreciate that DataKinds, though, later. |
| 16:14:57 | <dminuoso> | With Haskell, there is a large portion about unlearning mindsets and learning new techniques, almost starting from scratch. |
| 16:15:05 | <dminuoso> | bwe: Lets keep the DataKinds, though. |
| 16:15:31 | <bwe> | dminuoso: here's the latest version: https://play-haskell.tomsmeding.com/saved/9jXIcvKT |
| 16:16:16 | <bwe> | dminuoso: oh, I see, there's not too much difference in concepts with or without DataKinds |
| 16:16:18 | <dminuoso> | bwe: So the idea is that with HasDict you can provide evidence for another constraint. |
| 16:16:31 | <dminuoso> | bwe: Say you can attach evidence onto a SiteVariant for your HasGeneral constraint. |
| 16:16:43 | <dminuoso> | bwe: Right, DataKinds just cleans it up. |
| 16:16:53 | <dminuoso> | So you dont have both A and SiteA flying around. |
| 16:17:15 | <bwe> | (I was scared for it to complicate things further.) |
| 16:18:13 | <dminuoso> | Well, we're of course overcomplicating all of this. I did not know this was an XY problem yesterday. ;-) |
| 16:18:29 | <dminuoso> | Might as well go all-in! |
| 16:18:31 | <bwe> | Yeah, I had that gut feeling already. |
| 16:18:42 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 272 seconds) |
| 16:19:23 | <dminuoso> | bwe: So if you bring your HasGeneral typeclass back, make instances for `HasGeneral SiteA` and `HasGeneral SiteB` |
| 16:19:30 | <Square2> | dminuoso, Yes, I've been there. But, yeah. To begin with, they'll only need to grasp basic functor/monad constructs. I feel it should be doable for people who got MSc's in comp science. |
| 16:19:46 | <dminuoso> | Square2: My best advice, avoid the words `functor` and `monad`. |
| 16:19:53 | <dminuoso> | Avoid the constructs entirely. |
| 16:20:23 | × | ubert quits (~Thunderbi@178.115.41.15.wireless.dyn.drei.com) (Remote host closed the connection) |
| 16:20:31 | <Square2> | Not sure I can, but yeah I see your point. |
| 16:20:37 | <mari-estel> | huh come on, functors are not that scary |
| 16:20:42 | → | ubert joins (~Thunderbi@178.115.41.15.wireless.dyn.drei.com) |
| 16:22:44 | <bwe> | dminuoso: https://play-haskell.tomsmeding.com/saved/Yl8rZptl |
| 16:25:52 | <bwe> | dminuoso: `Dict (IntoGeneral a)` in the function head of `fromDBEntry` remains, because that is the dict for `withDict dict`? |
| 16:26:47 | <bwe> | dminuoso: Do I have to define HasDict instances now? |
| 16:28:02 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 16:29:44 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 16:30:33 | → | ljdarj joins (~Thunderbi@user/ljdarj) |
| 16:31:26 | <bwe> | I don't, because `withDict :: Dict c -> (c => r) -> r` is possible and `Dict (IntoGeneral a)` comes into play here… |
| 16:32:44 | <bwe> | `withDict :: Dict (IntoGeneral a) -> (IntoGeneral a => SiteVariant) -> SiteVariant` |
| 16:35:10 | <bwe> | dminuoso: still here? https://play-haskell.tomsmeding.com/saved/6PnEpvyR |
| 16:38:28 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds) |
| 16:41:17 | × | img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in) |
| 16:42:41 | → | img joins (~img@user/img) |
| 16:45:45 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 16:49:20 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 16:50:25 | → | euleritian joins (~euleritia@dynamic-176-004-009-213.176.4.pool.telefonica.de) |
| 16:52:51 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds) |
| 16:58:35 | → | caconym joins (~caconym@user/caconym) |
| 16:59:01 | × | SlackCoder quits (~SlackCode@208.26.70.132) (Remote host closed the connection) |
| 17:07:09 | × | euleritian quits (~euleritia@dynamic-176-004-009-213.176.4.pool.telefonica.de) (Read error: Connection reset by peer) |
| 17:08:01 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 17:09:59 | × | chele quits (~chele@user/chele) (Remote host closed the connection) |
| 17:14:27 | → | ljdarj joins (~Thunderbi@user/ljdarj) |
| 17:26:29 | × | son0p quits (~ff@2800:e6:4001:6cc3:2748:5c2a:65d9:57ac) (Ping timeout: 252 seconds) |
| 17:28:07 | → | Tuplanolla joins (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) |
| 17:30:41 | × | ash3en quits (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Quit: ash3en) |
| 17:31:09 | → | forell joins (~forell@user/forell) |
| 17:31:31 | → | ljdarj1 joins (~Thunderbi@user/ljdarj) |
| 17:33:43 | × | acidjnk_new quits (~acidjnk@p200300d6e7283f43b9a67790c51d38b0.dip0.t-ipconnect.de) (Ping timeout: 245 seconds) |
| 17:35:23 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds) |
| 17:35:23 | ljdarj1 | is now known as ljdarj |
| 17:38:54 | → | chexum_ joins (~quassel@gateway/tor-sasl/chexum) |
| 17:39:51 | × | _xor quits (~xor@ip-66-42-132-175.dynamic.fuse.net) (Quit: brb/bbiab) |
| 17:40:44 | <tomsmeding> | bwe: https://play-haskell.tomsmeding.com/saved/jPsc7ZTz ? |
| 17:41:17 | <tomsmeding> | though `fromHTML (Proxy @SiteA) html` also works, why was the withDict there? |
| 17:42:18 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 272 seconds) |
| 17:42:35 | × | kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Ping timeout: 255 seconds) |
| 17:42:56 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 17:43:06 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 260 seconds) |
| 17:43:58 | → | briandaed joins (~root@user/briandaed) |
| 17:48:51 | → | _xor joins (~xor@ip-66-42-132-175.dynamic.fuse.net) |
| 17:50:19 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 17:53:51 | → | acidjnk_new joins (~acidjnk@p200300d6e7283f43690414510db8e884.dip0.t-ipconnect.de) |
| 17:55:48 | → | ft joins (~ft@p508dbc6e.dip0.t-ipconnect.de) |
| 17:56:01 | → | Everything joins (~Everythin@94.153.8.251) |
| 17:56:32 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 255 seconds) |
| 17:56:58 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 17:57:20 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds) |
| 17:59:18 | → | lxsameer joins (~lxsameer@Serene/lxsameer) |
| 18:02:41 | <bwe> | tomsmeding: yep, that's what I was after. thanks for the solution. |
| 18:04:13 | <bwe> | tomsmeding: https://play-haskell.tomsmeding.com/saved/1d6dIp1u <- actually, if fromHTML generates `SiteVariant` inbetween on the way to produce `General`, I'd like `fromHTML` to return that, too, for debugging purposes. |
| 18:05:12 | <bwe> | tomsmeding: withDict because not using DataKinds |
| 18:05:23 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 245 seconds) |
| 18:05:49 | <tomsmeding> | bwe: what do you mean with "because not using DataKinds"? |
| 18:06:03 | → | euleritian joins (~euleritia@dynamic-176-001-003-233.176.1.pool.telefonica.de) |
| 18:06:06 | <tomsmeding> | bwe: the moment you write `IntoGeneral SiteA` you're using DataKinds |
| 18:06:26 | <tomsmeding> | that SiteA there is in the position where a type is expected, but it's a data constructor; DataKinds lifts it to a type |
| 18:07:02 | <bwe> | tomsmeding: yup, but I've started out using withDict before dminuoso proposed to switch to DataKinds |
| 18:07:06 | <tomsmeding> | a type that has no values (because it's not a type of kind Type), hence you can't ask for a value of it in the type of fromHTML |
| 18:07:32 | <tomsmeding> | I see, I haven't followed the discussion, just saw your last post :) |
| 18:07:48 | × | euleritian quits (~euleritia@dynamic-176-001-003-233.176.1.pool.telefonica.de) (Read error: Connection reset by peer) |
| 18:08:02 | <tomsmeding> | bwe: that 'a' return value from fromHTML is suspect |
| 18:08:03 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 18:08:09 | <tomsmeding> | how are you going to create a SiteA? |
| 18:08:19 | <tomsmeding> | a _value of type SiteA_, to be precise? |
| 18:08:33 | <bwe> | so, I had three initiations recently: Proxy, Constraints / withDict and DataKinds |
| 18:09:22 | <tomsmeding> | ah with your latest paste, GHC complains as I expect |
| 18:09:31 | <tomsmeding> | SiteA is not a type of kind Type |
| 18:09:57 | <bwe> | tomsmeding: https://play-haskell.tomsmeding.com/saved/dfb9mlT9 |
| 18:10:10 | <tomsmeding> | how are you going to write initSiteA? |
| 18:10:14 | <tomsmeding> | that function has no definition |
| 18:10:28 | <tomsmeding> | it is _impossible_ to write an initSiteA that is not undefined |
| 18:10:57 | <tomsmeding> | if you want to return the _constructor_ SiteA instead, it should be initSiteA :: SiteVariant |
| 18:11:35 | <bwe> | tomsmeding: You got me :). |
| 18:11:43 | <bwe> | https://play-haskell.tomsmeding.com/saved/hi8Hh5MO |
| 18:11:57 | <tomsmeding> | still an 'a' left in the return type of fromHTML |
| 18:12:15 | <tomsmeding> | this doesn't typecheck |
| 18:12:16 | <bwe> | so that will be then SiteVariant |
| 18:12:33 | <tomsmeding> | (if you're posting playground snippets, you can check them with a click on a button -- do so ;) ) |
| 18:12:45 | → | ash3en joins (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) |
| 18:13:54 | <tomsmeding> | bwe: are you perhaps confused because you actually intended to write `data SiteVariant = SiteA SiteA | SiteB SiteB`? |
| 18:13:59 | <tomsmeding> | where SiteA and SiteB are actual data types with fields |
| 18:15:44 | → | tzh joins (~tzh@c-76-115-131-146.hsd1.or.comcast.net) |
| 18:16:02 | <bwe> | so reversing DataKinds for a moment: https://play-haskell.tomsmeding.com/saved/eaWYsjTO |
| 18:16:57 | <bwe> | (it's not compiling, ofc) |
| 18:18:20 | <tomsmeding> | bwe: this is getting closer, but something else is still off: in fromDBEntry, you're deciding which variant to return based on siteVariant from the DBEntry, but the _type_ you hvae to return, 'a', is from that Dict (IntoGeneral a) argument |
| 18:18:49 | <tomsmeding> | so this ain't going to work: _you_ want to choose, based on a value inside the DBEntry, what 'a' is, but the type signature of fromDBEntry allows the caller of fromDBEntry to choose 'a' |
| 18:19:01 | → | Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542) |
| 18:19:17 | <bwe> | https://play-haskell.tomsmeding.com/saved/TXQ84gHu |
| 18:19:29 | <tomsmeding> | same problem |
| 18:19:34 | <tomsmeding> | the caller is allowed to choose a1 |
| 18:19:54 | <tomsmeding> | you could give Variant and DBEntry a type argument indicating what the variant is for (SiteA or SiteB) |
| 18:20:09 | <tomsmeding> | then the return type of fromDBEntry is linked to the _value_ inside the DBEntry |
| 18:20:39 | <bwe> | that would be type level programming, correct? |
| 18:20:52 | <tomsmeding> | no |
| 18:21:04 | <tomsmeding> | well, not really |
| 18:21:16 | <tomsmeding> | what is the X problem here (as in X-Y problem) :p |
| 18:21:23 | <tomsmeding> | where does DBEntry come from? |
| 18:21:29 | <tomsmeding> | what is the context? |
| 18:22:03 | <tomsmeding> | there are various ways something _like_ this can typecheck, but they all result in different designs of the program |
| 18:22:09 | <bwe> | oh, storing multiple pages of different websites to a DB, differentiated by Variant |
| 18:22:31 | <tomsmeding> | right, so you're getting untyped data from the database, and you want to "create" more typing info? |
| 18:22:50 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 244 seconds) |
| 18:23:25 | <bwe> | then loading that from DB, channelling it into different parsing machinery depending on `Variant`, which eventually culminates into `General` which is abstract, again |
| 18:23:44 | <bwe> | are we getting closer to X of XY :) ? |
| 18:25:32 | <tomsmeding> | bwe: what about a low-tech option? https://play-haskell.tomsmeding.com/saved/au6S9SPc |
| 18:26:10 | <tomsmeding> | just make a new sum type with the possible pages inside |
| 18:26:13 | → | ljdarj1 joins (~Thunderbi@user/ljdarj) |
| 18:28:05 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 18:29:33 | <tomsmeding> | if you want to invent type information that did not exist beforehand, you'll need an existential wrapper around the result to allow the function to choose the type, not the caller |
| 18:29:33 | × | ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 244 seconds) |
| 18:29:33 | ljdarj1 | is now known as ljdarj |
| 18:29:43 | <tomsmeding> | but I suspect this is good enough for you |
| 18:30:29 | <probie> | bwe: I haven't quite been following what you're trying to do, but could https://play-haskell.tomsmeding.com/saved/gnOyTnbR work? |
| 18:30:31 | <bwe> | thumbs up :) |
| 18:30:47 | <tomsmeding> | right, that's one way of encoding that existential lol |
| 18:31:22 | × | ash3en quits (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Quit: ash3en) |
| 18:31:42 | → | euleritian joins (~euleritia@dynamic-176-006-139-078.176.6.pool.telefonica.de) |
| 18:32:04 | <tomsmeding> | probie: but given the methods of the IntoGeneral class, I don't feel like an implementation of that continuation could do much more than with the untyped version |
| 18:32:32 | <tomsmeding> | sometimes simple is better :) |
| 18:32:35 | <bwe> | so what's the buzz about the forall? |
| 18:32:56 | <tomsmeding> | that forall in probie's version means that the caller has to pass fromDBEntry a function that works for _any_ a |
| 18:33:05 | <tomsmeding> | hence fromDBEntry can choose what that 'a' is going to be |
| 18:33:18 | → | Square joins (~Square@user/square) |
| 18:33:44 | → | ash3en joins (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) |
| 18:33:50 | <tomsmeding> | (and then fromDBEntry just returns whatever that function returns, of type 'r') |
| 18:34:25 | <tomsmeding> | this is one way of encoding an existential in haskell; the other is using a data type that wraps the existential inside |
| 18:35:15 | <tomsmeding> | but given the functions you're writing here, I don't think the additional typing gives you much, because when you get that (a, General), you still don't know what 'a' is, so you'll have to do something to figure that out |
| 18:35:36 | <tomsmeding> | and with my untyped version, you also don't know what kind of site you're getting, but at least you can easily figure out by checking whether it's an SVA or an SVB |
| 18:35:42 | <bwe> | let that sink in |
| 18:35:55 | <tomsmeding> | existentials are awkward in haskell, and they're usually not what you need |
| 18:36:02 | <tomsmeding> | but they exist for the times when you do |
| 18:36:06 | <bwe> | tomsmeding: so, avoid whenever possible forall? |
| 18:36:18 | <tomsmeding> | well there's implicit foralls on many haskell functions ;) |
| 18:36:20 | <tomsmeding> | % :t map |
| 18:36:20 | <yahb2> | map :: (a -> b) -> [a] -> [b] |
| 18:36:24 | <tomsmeding> | % :set -fprint-explicit-foralls |
| 18:36:24 | <yahb2> | <no output> |
| 18:36:26 | <tomsmeding> | % :t map |
| 18:36:26 | <yahb2> | map :: forall a b. (a -> b) -> [a] -> [b] |
| 18:36:56 | <tomsmeding> | it's the foralls inside argument types that bring you in RankNTypes land |
| 18:37:02 | <bwe> | tomsmeding: and the SiteVariant with SVA and SVBs got introduced by you to return a single type with fromDBEntry (instead of SiteA, SiteB different types |
| 18:37:08 | <tomsmeding> | exactly |
| 18:37:17 | <bwe> | tomsmeding: so avoid or not avoid foralls is the question |
| 18:37:19 | <tomsmeding> | the caller has to know what they get back from fromDBEntry |
| 18:37:24 | × | Square2 quits (~Square4@user/square) (Ping timeout: 260 seconds) |
| 18:37:36 | <bwe> | btw how persistent is your paste? |
| 18:37:41 | <tomsmeding> | I'd say, avoid explicit 'forall' for now, as you're learning |
| 18:37:41 | × | euleritian quits (~euleritia@dynamic-176-006-139-078.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 18:37:52 | <tomsmeding> | persistent |
| 18:37:55 | <bwe> | tomsmeding, dminuoso, probie: thanks for your support! |
| 18:37:59 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 18:38:57 | <tomsmeding> | I use foralls daily, so I'm not going to say "avoid foralls" -- but I don't think you need them yet :p |
| 18:40:06 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 18:40:26 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 18:40:34 | → | Perseverance_ joins (~Persevera@2.219.56.221) |
| 18:44:08 | <bwe> | tomsmeding: actually, your low-tech version makes my day with the collector type SiteVariant. I was not seeing the forest for the trees. |
| 18:44:14 | × | Perseverance quits (~Persevera@2.219.56.221) (Ping timeout: 255 seconds) |
| 18:44:55 | <tomsmeding> | yay :) |
| 18:46:08 | <bwe> | though, I could make the return type same of all fromHTMLs and make them into instances, why not? |
| 18:47:03 | <tomsmeding> | instances for which types? |
| 18:47:06 | × | Natch quits (~natch@c-92-34-7-158.bbcust.telenor.se) (Remote host closed the connection) |
| 18:47:46 | <tomsmeding> | if you're only going to call those instance methods by explicitly specifying at which type you want to use them, then what's the benefit over plain functions? |
| 18:52:39 | <bwe> | instance IntoGeneral SiteA where fromHTML … = |
| 18:52:48 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 18:53:04 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 18:58:02 | ← | L29Ah parts (~L29Ah@wikipedia/L29Ah) () |
| 18:59:23 | × | gawen quits (~gawen@user/gawen) (Quit: cya) |
| 18:59:51 | <tomsmeding> | bwe: if you can split up your code like that, then sure :) |
| 19:00:46 | → | gawen joins (~gawen@user/gawen) |
| 19:01:23 | <dminuoso> | 8:21:16 tomsmeding │ what is the X problem here (as in X-Y problem) :p |
| 19:01:44 | <dminuoso> | For what its worth, this was a conscious effort to explore Y-and-then-Z type of solutions. |
| 19:02:16 | <dminuoso> | All they just needed was `case-of`. But that shouldn't keep one from exploring the mysteries of DataKinds, ConstraintKinds and GADTs. |
| 19:03:06 | → | cuteguest joins (~cuteguest@67-134-33-194.dia.static.qwest.net) |
| 19:03:18 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 252 seconds) |
| 19:04:30 | <dminuoso> | tomsmeding: Interesting by the way, personally Im an advocate for explicit forall everywhere. |
| 19:04:37 | <dminuoso> | Especially during the learning experience. |
| 19:06:33 | <cuteguest> | hiii #haskell hiii! just wondering.. is it possible to make monads that have their type change as they get combined and stuff? like, two monads holding type-level lists combining those lists when put together.. would i need to use something extra like existential types or spooky like indexed monads? |
| 19:07:06 | <dminuoso> | cuteguest: Yes, there's a bunch of theories and libraries that explore the idea of adding effects. |
| 19:07:47 | <cuteguest> | hmm hmm interesting.. could you let me know an example? |
| 19:07:54 | <dminuoso> | cuteguest: https://hackage.haskell.org/package/effectful is one of many examples. |
| 19:08:12 | <dminuoso> | Well, one of the few that specifically uses type-level lists to talk about effects. |
| 19:08:41 | <cuteguest> | oh no way! like those kinds of effects! i was exploring those previously.. hmm.. t |
| 19:10:33 | × | ubert quits (~Thunderbi@178.115.41.15.wireless.dyn.drei.com) (Ping timeout: 252 seconds) |
| 19:10:51 | × | szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity) |
| 19:11:11 | <tomsmeding> | dminuoso: I see :p |
| 19:11:47 | <dminuoso> | cuteguest: One of the ideas in effectful is that rather than encoding your program parts in some specific monad, you write it polymorphically in terms of any monad that supports the required effects (encoded as a type-level list in the constraint). |
| 19:12:28 | × | lxsameer quits (~lxsameer@Serene/lxsameer) (Ping timeout: 245 seconds) |
| 19:14:20 | <cuteguest> | hmm hmm |
| 19:16:12 | <cuteguest> | i will look more into those.. until next time! <3 |
| 19:16:47 | × | cuteguest quits (~cuteguest@67-134-33-194.dia.static.qwest.net) (Quit: Client closed) |
| 19:20:15 | → | Achylles joins (~Achylles@45.182.57.50) |
| 19:20:54 | × | divya quits (~user@139.5.11.231) (Ping timeout: 252 seconds) |
| 19:20:57 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 19:22:39 | → | sprotte24 joins (~sprotte24@p200300d16f055c00183f3372b555334d.dip0.t-ipconnect.de) |
| 19:28:56 | × | chexum_ quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 19:29:06 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 19:31:17 | × | pabs3 quits (~pabs3@user/pabs3) (Read error: Connection reset by peer) |
| 19:33:00 | × | L29Ah quits (~L29Ah@wikipedia/L29Ah) (Read error: Connection reset by peer) |
| 19:35:58 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 19:37:18 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 19:42:54 | × | Putonlalla quits (~Putonlall@it-cyan.it.jyu.fi) (Ping timeout: 260 seconds) |
| 19:45:28 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Ping timeout: 252 seconds) |
| 19:46:19 | → | euleritian joins (~euleritia@dynamic-176-007-213-152.176.7.pool.telefonica.de) |
| 19:47:17 | → | pabs3 joins (~pabs3@user/pabs3) |
| 19:48:24 | × | Achylles quits (~Achylles@45.182.57.50) (Remote host closed the connection) |
| 19:49:21 | × | Digit quits (~user@user/digit) (Read error: Connection reset by peer) |
| 19:51:08 | → | Digit joins (~user@user/digit) |
| 19:51:41 | × | weary-traveler quits (~user@user/user363627) (Remote host closed the connection) |
| 19:52:34 | × | pabs3 quits (~pabs3@user/pabs3) (Excess Flood) |
| 19:53:14 | × | euleritian quits (~euleritia@dynamic-176-007-213-152.176.7.pool.telefonica.de) (Ping timeout: 260 seconds) |
| 19:54:15 | → | pabs3 joins (~pabs3@user/pabs3) |
| 19:57:48 | × | mari-estel quits (~mari-este@user/mari-estel) (Quit: feierabend) |
| 20:00:00 | × | caconym quits (~caconym@user/caconym) (Quit: bye) |
| 20:00:37 | → | caconym joins (~caconym@user/caconym) |
| 20:04:10 | → | JuanDaugherty joins (~juan@user/JuanDaugherty) |
| 20:06:13 | × | euphores quits (~SASL_euph@user/euphores) (Ping timeout: 248 seconds) |
| 20:10:29 | → | weary-traveler joins (~user@user/user363627) |
| 20:12:47 | → | euphores joins (~SASL_euph@user/euphores) |
| 20:15:28 | × | ash3en quits (~Thunderbi@2a03:7846:b6eb:101:93ac:a90a:da67:f207) (Quit: ash3en) |
| 20:15:37 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Quit: sord937) |
| 20:22:52 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 252 seconds) |
| 20:24:39 | → | slack1256 joins (~slack1256@2803:c600:5111:8696:5898:f40:25b6:cbde) |
| 20:25:53 | <slack1256> | Hi, when using tasty, is there a way to put log statements that only get shown on failing test cases? Hopefully I can know where the test is failing. |
| 20:26:50 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 20:27:33 | ← | L29Ah parts (~L29Ah@wikipedia/L29Ah) () |
| 20:28:19 | → | slac59155 joins (~slack1256@179.60.70.224) |
| 20:29:37 | <briandaed> | slack1256: rough guess, https://hackage.haskell.org/package/tasty-1.5.2/docs/Test-Tasty-Ingredients-ConsoleReporter.html HideSuccesses ? |
| 20:30:50 | × | slack1256 quits (~slack1256@2803:c600:5111:8696:5898:f40:25b6:cbde) (Ping timeout: 265 seconds) |
| 20:31:27 | slac59155 | is now known as slack1256 |
| 20:33:18 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 245 seconds) |
| 20:33:40 | <bwe> | tomsmeding: here's the instance version combined with your low-tech: https://play-haskell.tomsmeding.com/saved/og0rU42L |
| 20:42:39 | × | Square quits (~Square@user/square) (Ping timeout: 252 seconds) |
| 20:53:13 | × | Me-me quits (~me-me@kc.randomserver.name) (Changing host) |
| 20:53:13 | → | Me-me joins (~me-me@user/me-me) |
| 20:54:47 | → | notzmv joins (~umar@user/notzmv) |
| 20:55:25 | <probie> | bwe: In that case, you don't actually need the proxy in `fromHTML`. Because of your use of `SVA` and `SVB` the compiler can already tell which `IntoGeneral` instance you want. https://play-haskell.tomsmeding.com/saved/Ji8UOdbK |
| 21:01:05 | <bwe> | probie: could I trade in the proxy for getting rid of the `SiteVariant` then? |
| 21:02:19 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 21:06:58 | × | euleritian quits (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 21:07:43 | → | euleritian joins (~euleritia@ip4d16fc9f.dynamic.kabel-deutschland.de) |
| 21:08:20 | × | machinedgod quits (~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 252 seconds) |
| 21:09:28 | <probie> | The main use of proxy is to specify type arguments that appear in constraints but not in the function's actual parameters |
| 21:11:51 | <bwe> | probie: so, then that would be an option for withDict? I still haven't grasped the differentiation between withDict and Proxy |
| 21:15:48 | <probie> | For a small example of the kinds of things Proxy can be helpful with https://play-haskell.tomsmeding.com/saved/aFVLmRFu |
| 21:19:46 | <haskellbridge> | <Bowuigi> Proxy is a sort of replacement for required type arguments. Haskell has both nowadays (IIRC), but the latter is far newer |
| 21:20:42 | <haskellbridge> | <Bowuigi> Required type arguments is experimental https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/required_type_arguments.html |
| 21:22:02 | <bwe> | I need to write up a summary of withDict, Proxy, forall, required type args… |
| 21:22:32 | <bwe> | any concept I missed? |
| 21:26:45 | <haskellbridge> | <Bowuigi> "Ambiguous types" is related I guess |
| 21:29:17 | × | JuanDaugherty quits (~juan@user/JuanDaugherty) (Quit: JuanDaugherty) |
| 21:33:59 | <Leary> | bwe: There's also this kind of approach: https://play-haskell.tomsmeding.com/saved/O7sV5HJ2 |
| 21:34:40 | <Leary> | (foregoing the type class in favour of branching on a singleton) |
| 21:38:13 | × | briandaed quits (~root@user/briandaed) (Remote host closed the connection) |
| 21:38:17 | → | faultline joins (~christian@193.32.248.166) |
| 21:42:35 | → | CoolMa7 joins (~CoolMa7@ip5f5b8957.dynamic.kabel-deutschland.de) |
| 21:42:49 | <bwe> | Leary: That's a GADT, right? oh, I see the language extension reveals it :) |
| 21:42:50 | × | takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
| 21:43:48 | <haskellbridge> | <Bowuigi> Huh that is interesting |
| 21:44:06 | <Leary> | `Var` is, yes. `Some` too, kindof. And `Specific`, I'd expect. |
| 21:44:21 | <Leary> | I've come to prefer this approach when we don't actually want an /open/ class. |
| 21:44:23 | <haskellbridge> | <Bowuigi> Some is just an existential |
| 21:45:01 | <haskellbridge> | <Bowuigi> And Specific and General are just phantom types |
| 21:45:33 | <Leary> | I've just left the implementation of their constructors undefined. |
| 21:45:44 | <Leary> | They're for bwe to decide. |
| 21:45:48 | <haskellbridge> | <Bowuigi> Oh that also works |
| 21:46:53 | <haskellbridge> | <Bowuigi> So it is an odd encoding of intersection types used for overloading? |
| 21:48:06 | <haskellbridge> | <Bowuigi> I have seen a similar approach before, but using labels and a label constructor instead of Var, and an intersection type implemented with a polymorphic label that selects the matching field from a record |
| 21:48:13 | <Leary> | Intersection? It's just a sum type, where more or less type information is revealed depending on need. |
| 21:48:19 | × | Everything quits (~Everythin@94.153.8.251) (Ping timeout: 260 seconds) |
| 21:49:52 | <haskellbridge> | <Bowuigi> Hmmm |
| 21:50:09 | → | Everything joins (~Everythin@46.211.136.70) |
| 21:50:21 | <haskellbridge> | <Bowuigi> Yeah I think I get it |
| 21:58:09 | × | sprout quits (~sprout@2a02-a448-3a80-0-c61c-b515-5509-58e7.fixed6.kpn.net) (Quit: leaving) |
| 21:59:08 | × | noctux quits (~noctux@user/noctux) (Read error: Connection reset by peer) |
| 21:59:16 | → | noctux joins (~noctux@user/noctux) |
| 22:03:56 | × | gorignak quits (~gorignak@user/gorignak) (Quit: quit) |
| 22:04:01 | → | szkl joins (uid110435@id-110435.uxbridge.irccloud.com) |
| 22:04:13 | → | gorignak joins (~gorignak@user/gorignak) |
| 22:05:36 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 260 seconds) |
| 22:10:37 | → | gmg joins (~user@user/gehmehgeh) |
| 22:11:58 | × | michalz quits (~michalz@185.246.207.217) (Remote host closed the connection) |
| 22:12:15 | → | peterbecich joins (~Thunderbi@syn-047-229-123-186.res.spectrum.com) |
| 22:18:46 | → | son0p joins (~ff@2800:e2:f80:ee7::4) |
| 22:26:35 | × | CoolMa7 quits (~CoolMa7@ip5f5b8957.dynamic.kabel-deutschland.de) (Quit: My Mac has gone to sleep. ZZZzzz…) |
| 22:27:50 | × | __monty__ quits (~toonn@user/toonn) (Quit: leaving) |
| 22:27:52 | → | acidjnk_new3 joins (~acidjnk@p200300d6e7283f4324ec082b8a023956.dip0.t-ipconnect.de) |
| 22:29:44 | × | acidjnk_new quits (~acidjnk@p200300d6e7283f43690414510db8e884.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 22:33:12 | × | peterbecich quits (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 246 seconds) |
| 22:42:06 | → | ubert joins (~Thunderbi@178.115.41.15.wireless.dyn.drei.com) |
| 22:53:39 | → | Pozyomka joins (~pyon@user/pyon) |
| 22:57:26 | → | falafel joins (~falafel@2600:1700:99f4:2050:e0e9:d383:2312:4169) |
| 23:02:52 | × | misterfish quits (~misterfis@84.53.85.146) (Ping timeout: 244 seconds) |
| 23:19:25 | × | gorignak quits (~gorignak@user/gorignak) (Quit: quit) |
| 23:22:19 | × | falafel quits (~falafel@2600:1700:99f4:2050:e0e9:d383:2312:4169) (Ping timeout: 264 seconds) |
| 23:24:58 | → | gorignak joins (~gorignak@user/gorignak) |
| 23:25:03 | → | machinedgod joins (~machinedg@d108-173-18-100.abhsia.telus.net) |
| 23:42:19 | × | acidjnk_new3 quits (~acidjnk@p200300d6e7283f4324ec082b8a023956.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
| 23:49:23 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 23:54:32 | × | gorignak quits (~gorignak@user/gorignak) (Quit: quit) |
| 23:54:48 | → | gorignak joins (~gorignak@user/gorignak) |
All times are in UTC on 2024-11-20.