2024/11/14

Newest at the top

2024-11-14 15:16:32 +0100mari-estel(~mari-este@user/mari-estel) (Quit: errands)
2024-11-14 15:10:02 +0100 <dminuoso> bailsman: Do you have the actual code and the generated core to look at?
2024-11-14 15:06:31 +0100L29Ah(~L29Ah@wikipedia/L29Ah) (Ping timeout: 265 seconds)
2024-11-14 15:05:34 +0100ash3en(~Thunderbi@149.222.147.110) (Client Quit)
2024-11-14 15:01:26 +0100ash3en(~Thunderbi@149.222.147.110) ash3en
2024-11-14 14:56:06 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
2024-11-14 14:50:45 +0100weary-traveler(~user@user/user363627) user363627
2024-11-14 14:48:24 +0100misterfish(~misterfis@31-161-39-137.biz.kpn.net) (Ping timeout: 276 seconds)
2024-11-14 14:38:28 +0100mari-estel(~mari-este@user/mari-estel) mari-estel
2024-11-14 14:35:46 +0100acidjnk(~acidjnk@p200300d6e7283f73687bc11ede7922f8.dip0.t-ipconnect.de) acidjnk
2024-11-14 14:33:10 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2024-11-14 14:32:56 +0100weary-traveler(~user@user/user363627) (Remote host closed the connection)
2024-11-14 14:24:13 +0100alexherbo2(~alexherbo@2a02-8440-3313-668b-a9ec-921f-0511-ee3f.rev.sfr.net) alexherbo2
2024-11-14 14:18:58 +0100 <bailsman> I think if you need a mutable algorithm maybe you should do a CFFI or something.
2024-11-14 14:18:30 +0100 <geekosaur> but that's built into GC and I don't think vector can take advantage of it
2024-11-14 14:18:13 +0100 <bailsman> I tried look at it with -ddump-simpl and the mutable version doesn't compile to simple code at all. What should be like 5 assembly instructions turns into several pages of assembly.
2024-11-14 14:18:05 +0100 <geekosaur> for Array it's split into "cards" and modifications within a single card are batched so only a single copy needs to be done by the mutator, AIUI
2024-11-14 14:17:21 +0100 <geekosaur> it's still going to do copies, I think, and more of them the more elements you touch. but I'mnot sure how that plays out for vector
2024-11-14 14:16:51 +0100 <geekosaur> pretty much
2024-11-14 14:16:30 +0100 <bailsman> If you expect to touch every element, just use map.
2024-11-14 14:15:25 +0100 <bailsman> So the use cases are considerably more niche than I thought. Like if you need to exchange two elements or something, the pure version would have to copy the entire thing and the mutable version only two elements. But for most cases, it's a bait?
2024-11-14 14:14:28 +0100 <geekosaur> they will definitely have costs you don't incur with immutable vectors
2024-11-14 14:13:44 +0100 <bailsman> Huh, are mutable vectors a scam? `VM.iforM_ mv $ \i x -> VM.write mv i (updateValue x)` is considerably slower for simple objects, and barely faster than `map updateValue` even for large complex objects.
2024-11-14 14:12:30 +0100 <kuribas`> If you would evaluate the second element of the list, the debugger should not halt the whole expression.
2024-11-14 14:12:05 +0100 <lambdabot> 1
2024-11-14 14:12:04 +0100 <kuribas`> > head [1, undefined]
2024-11-14 14:05:11 +0100 <haskellbridge> <hellwolf> the lie is limited to the extent that, if your program is not total, would the debugger hurt your bottom where you intend to leave it so.
2024-11-14 14:02:26 +0100 <__monty__> There's the rub : )
2024-11-14 13:59:51 +0100alphazone(~alphazone@2.219.56.221)
2024-11-14 13:59:08 +0100 <kuribas`> Assuming it doesn't use unsafePerformIO.
2024-11-14 13:58:57 +0100 <kuribas`> __monty__: how can it be a lie with "pure" code?
2024-11-14 13:48:41 +0100 <__monty__> That would also cause confusion though. Since sometimes referential transparency is a lie. And it's easy to convince yourself that the expressions must surely be evaluating in the order you think they are.
2024-11-14 13:47:50 +0100mari73904(~mari-este@user/mari-estel) (Ping timeout: 255 seconds)
2024-11-14 13:47:01 +0100mari-estel(~mari-este@user/mari-estel) (Client Quit)
2024-11-14 13:47:00 +0100 <kuribas`> As long as the semantics are preserved.
2024-11-14 13:46:40 +0100 <kuribas`> I the end, lazyness doesn't specify an order for execution.
2024-11-14 13:46:10 +0100 <kuribas`> A more useful pure debugger would allow you to choose which expression to evaluate.
2024-11-14 13:45:55 +0100 <kuribas`> The problem is that the GHC debugger follow the imperative model for debugging (stepping through, etc..)
2024-11-14 13:44:51 +0100mari-estel(~mari-este@user/mari-estel) mari-estel
2024-11-14 13:44:19 +0100mari-estel(~mari-este@user/mari-estel) (Read error: Connection reset by peer)
2024-11-14 13:43:13 +0100mari73904(~mari-este@user/mari-estel) mari-estel
2024-11-14 13:41:53 +0100 <hellwolf> Debug.Trace (trace)
2024-11-14 13:41:35 +0100 <hellwolf> Does Trace.trace help?
2024-11-14 13:38:40 +0100 <mari-estel> prints or traces are a good way to collect test samples while troubleshooting
2024-11-14 13:38:40 +0100 <mari-estel> huh properties help equally with pure and monadic
2024-11-14 13:37:49 +0100mari59415(~mari-este@user/mari-estel) (Read error: Connection reset by peer)
2024-11-14 13:36:10 +0100 <hellwolf> fwiw, @dminuoso, I had a small example here https://discourse.haskell.org/t/variable-arity-currying-helper/10659 that decorates "let foo' = curry' (MkFn foo)" but that assumes all arguments is "showable". to make it runTrace, you'd need to have a default instance for all types, and then overlapping instance for Show, Num, Functor, etc.
2024-11-14 13:35:34 +0100mari-estel(~mari-este@user/mari-estel) mari-estel
2024-11-14 13:34:38 +0100 <hellwolf> exactly, mari59415, it is a problem most applicable to impure code. For pure code, you write properties (which means thinking a lot about what you are writing.)
2024-11-14 13:33:53 +0100 <hellwolf> But I find the habit of spending more time in thinking then examining into what happened is a better use of time. Of course, on the contrary, Linus, notoriously, promoted the idea of printf debugging. So I guess the tool influence on how you do troubleshooting.