Haskell For Dilettantes 13: seqOptional
20:37
Let's Play 3 in Three - Part 3
1:01:17
14 күн бұрын
Let's Play 3 in Three, Part 2
53:08
Haskell For Dilettantes, Part 9
45:08
Haskell For Dilettantes, Part 8
33:49
Let's Play 3 In Three (Part 1)
1:06:18
Rest in Peace, Werdna
5:55
Ай бұрын
Eye of the Beholder (DOS) Part 2
47:25
Eye of the Beholder (DOS) Part 1
28:03
Eye of the Beholder - on Sega CD
40:09
Пікірлер
@epistemocrat
@epistemocrat Күн бұрын
can't find the university course links anymore.. 404.. any help? btw great work, love the style too
@TeaLeavesProgramming
@TeaLeavesProgramming 8 сағат бұрын
Thanks for the kind words! This link works for me: www.seas.upenn.edu/~cis1940/fall16/index.html
@FlClJulianApostate
@FlClJulianApostate 2 күн бұрын
Note that the type of the dot operator (aka function composition) is >>> :t (.) (.) :: (b -> c) -> (a -> b) -> a -> c which means that it exactly matches the type of fmap (aka (<$>)) for instance Functor ((->) r) which means that (<$>) is exactly equal to (.) for functions as functor instances, i.e. (<$>) = (.) Check this in ghci: >>> fmap (subtract 2) (+23) 3 24 >>> (.) (subtract 2) (+23) 3 24
@TeaLeavesProgramming
@TeaLeavesProgramming Күн бұрын
Interesting - I never made that connection! As I said in the video, I definitely have trouble thinking about the (->) function as "just a function".
@FlClJulianApostate
@FlClJulianApostate Күн бұрын
@@TeaLeavesProgramming this is perfectly natural: you have a function of one argument (as a functor instance) and want to yield another function of one argument (as the result of function transformation), what do you need for this? Function composition! And this is the fmap in the functor sense.
@MatthewHaydenRE
@MatthewHaydenRE 3 күн бұрын
3:55 I think you're mixing up Optional from Rust with Maybe from Haskell.
@TeaLeavesProgramming
@TeaLeavesProgramming 3 күн бұрын
It's a little weirder than that; the particular course I'm doing doesn't use the built-in Haskell types (besides, like, Int) but builds its own versions of them from scratch. So although you're correct that Data.Maybe is the optional type in Haskell, in this course they actually implemented a type literally called "Optional".
@ICopiedJohnOswald
@ICopiedJohnOswald 4 күн бұрын
"What is a functor? A functor is anything that implements this function" Coming from a professional Haskell developer, this is a perfect definition for functors in Haskell but with the caveat that it has to satisfy those laws you mentioned initially. Otherwise you can have degenerate definitions like: instance Functor [] where fmap f xs = [] or even: instance Functor f where fmap f x = undefined
@TeaLeavesProgramming
@TeaLeavesProgramming 4 күн бұрын
An important caveat - thank you.
@AC3electrosphere
@AC3electrosphere 6 күн бұрын
Very informative and straight to the point, many thanks. I'll probably stick with the Playstation 1 version...
@FlClJulianApostate
@FlClJulianApostate 8 күн бұрын
no fold functions are able to implement produce because they apply to a list while produce doesn't accept a list but rather produces one
@ArthurSchoppenweghauer
@ArthurSchoppenweghauer 13 күн бұрын
What's that spacy music in the background? Sounds nice.
@TeaLeavesProgramming
@TeaLeavesProgramming 11 күн бұрын
It's by Ben Cox. The song is called "Threads" bencox.bandcamp.com/
@rimonhalim2856
@rimonhalim2856 14 күн бұрын
Hi can I add barcode to inventory items?
@christianschafer3724
@christianschafer3724 17 күн бұрын
On the names: If you have a concrete value like a specific tile, it should have a descriptive name, even in Haskell. But the more abstract a function is, e. g. like mapList, the less descriptive names can be and long names just become a distraction, e. g. `x xs` instead of `firstElement remainingElements`.
@TeaLeavesProgramming
@TeaLeavesProgramming 16 күн бұрын
I've heard this argument and understand it, but I find that there comes a point where when a token is too short (and "x" and "xs" are good examples of this) my eyes just slide right over it, and this is much more distracting to me than if they had meaningless but recognizable names.
@NiDeCo
@NiDeCo 2 күн бұрын
@@TeaLeavesProgramming Your naming definitely makes sense in this context. I would have done the same :)
@christianschafer3724
@christianschafer3724 17 күн бұрын
I have to remind myself: Each time I use (if/then/else), check if I should rather use pattern matching or a guard. Also interesting to follow your thought process on handleEvent. I "cheated" and used Maybe and `orElse` to compose the different potentially event handling use cases (win, move player, move box, change direction, or else keep existing state if any other key was pressed).
@christianschafer3724
@christianschafer3724 18 күн бұрын
Great videos, fun to watch and to follow. I'm still a beginner in Haskell and feel like I will always be. But it teaches me so much about structure and style that I can use in other languages as well. I came up with a very similar solution as the example solution, mainly for symmetry reasons. But after I had implemented another maze I've got two different initial states! Switching between them in your solution would require to change two references to initialState. With a resetableInteractionOf, it's just one place. Also, if you'd ever implement a level selection, you could just pass the selected level. Considering, as an alternative, changing the event handler signature to receive an initial state just for this purpose seems bad style to me: The function would be doing too much.
@christianschafer3724
@christianschafer3724 18 күн бұрын
"Look, Haskell, you have a problem." 😂
@TeaLeavesProgramming
@TeaLeavesProgramming 18 күн бұрын
Maybe it's me who has the problem though!
@IamNomadSauce
@IamNomadSauce 21 күн бұрын
Dude, this resource as a whole is amazing, thank you for putting the time in to do this.
@TeaLeavesProgramming
@TeaLeavesProgramming 21 күн бұрын
So glad you are enjoying it. Tell your friends!
@Jack-bk7fg
@Jack-bk7fg 22 күн бұрын
A good video. I have chosen to purchase the PS1 version. Thank you
@TeaLeavesProgramming
@TeaLeavesProgramming 22 күн бұрын
Good choice, and please report back with your experience!
@perryborn2777
@perryborn2777 22 күн бұрын
I'm 23 years old and decided to give Wizardry a try Really enjoying it so far! Floor 3 nearly wiped me when I made the mistake of digging too deep into the secret doors without casting Dumapic I also encountered two murphy's ghosts when I found him, so it definitely is still possible in the new version
@TeaLeavesProgramming
@TeaLeavesProgramming 22 күн бұрын
One of the strangest aspects of that first Wizardry game is that you can win the game by JUST exploring floors 1, 4, a tiny bit of floor 9, and floor 10; and in fact this is probably what most experienced players do. The risk/reward for exploring the middle floors is tricky because as you've discovered, they can be extremely punishing!
@ripwolfe
@ripwolfe 24 күн бұрын
Found you through Reddit and loving it so far. Just the right (2x) speed for me, considering I've only been at Haskell for 20 or 30 hours of reading, listening, and experimenting. Yes, very much the API should be be a bit more explicit. As for the `rectangle` API doc, yes, it could be better. At a minimum, they need to specify the order to be absolutely clear that it's width _then_ height.
@TeaLeavesProgramming
@TeaLeavesProgramming 24 күн бұрын
Thanks for coming on board! I spent a lot of time working in Objective-C, where the standard practice is that parameters carry names (kinda), which I think makes it easier to make things self-descriptive.
@nixomose
@nixomose 25 күн бұрын
I remember using a program that was called something like "visual 6502" or something like that, that was similar in concept to the program in the video, it was amazing, as it similarly animated the registers and memory access as it ran an assembly program. You wouldn't happen to know what it was called or have video of such a thing other than the one you show here? It was an amazing program and I'd love to relive that part of my childhood.
@TeaLeavesProgramming
@TeaLeavesProgramming 24 күн бұрын
There are several programs like this (visual 6502 is one of them) but I think you're looking for this program which was on one of the M.E.C.C. disks: kzbin.info/www/bejne/l4vZpKZqjdOWm7c&lc=UgxuNrP1qjNWlo4H-lx4AaABAg
@nixomose
@nixomose 24 күн бұрын
@@TeaLeavesProgramming so yeah it was very similar to that, but I remember the screen being a lot more busy and packed solid with information. I remember it shows addresses (like the actual "$0300") sliding down from one box to another denoting the loading of an address to do an LDA from kind of thing. Such hazy memories, but it was the absolute coolest thing, if you know of any others, even just the names, I'd appreciate. I'll go google spelunking for a while. If nothing else thanks for bringing back the memories.
@quad64bit
@quad64bit 25 күн бұрын
Thanks for this- new to my Apple ][+ and this taught me a great deal!! For others on a plus: boot the dos 3.3 master, switch to integer basic with INT, then you can CALL-151, and then F666G to get the mini assembler ! prompt! Thanks for the tip on Merlin too- older versions work on the + in 40 col mode. The manual is a must!
@Dan-nf6dj
@Dan-nf6dj 26 күн бұрын
Really cool videos -- it's nice to see people working to explain haskell (at least outside school, etc.). It'd be fun to see how one could program in haskell style in traditionally "blue collar" language's like Java (which now supports -- basic! -- algebraic types via sealed interfaces, switch expressions and records).
@TeaLeavesProgramming
@TeaLeavesProgramming 26 күн бұрын
I suspect that when we look back in 50 years at programming language development, GADTs are the one thing from FP that will be truly ubiquitous. They're just so useful! Thank you for the support of the channel!
@FábioLima-h7k
@FábioLima-h7k Ай бұрын
Thank you so much!
@TeaLeavesProgramming
@TeaLeavesProgramming 22 күн бұрын
You're welcome!
@АнатолийПетров-п8ч
@АнатолийПетров-п8ч Ай бұрын
Круто! Спасибо за работу, привет из 2024
@TeaLeavesProgramming
@TeaLeavesProgramming 22 күн бұрын
Спасибо!
@amartini51
@amartini51 Ай бұрын
Started watching this video when it went live on my dad's birthday. Brought back memories of watching him play 3 in Three at the Mac IIci on his desk in the living room. The puzzles were way too hard for me back then, so I only solved a tiny handful of them. Thanks for posting it!
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
I'm so glad that you enjoyed it. Thanks for watching, and hope you come back for the next ones!
@cpthurme
@cpthurme Ай бұрын
Awesome gaming! 🥳
@cpthurme
@cpthurme Ай бұрын
Love it! 💕
@DaveParr
@DaveParr Ай бұрын
16:58 great rake on mistakes and learning. Love that you are 'learning in public'. Instantly earned a sub.
@LeslieShuya
@LeslieShuya Ай бұрын
buddy, what website or software are you using for diagraming? I would be grateful if you tell me.
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
This is Helmut Neemann's "Digital". github.com/hneemann/Digital
@mskiptr
@mskiptr Ай бұрын
Hmm, to me "purely functional" has a very clear-cut meaning, while just "functional" can mean a lot of different things (and especially to different people).
@ICopiedJohnOswald
@ICopiedJohnOswald Ай бұрын
In Haskell all functions are implicitly curried. This means that the following to type signatures are the same: ``` moveFromTo :: Coord -> Coord -> Coord -> Coord moveFromTo :: Coord -> Coord -> (Coord -> Coord) ```
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
This is one of those things that I could explain on a whiteboard, but somehow when writing code never sticks in my brain, except when I'm doing cutesy "point free" code, and even then it's extra mental effort to get it right.
@ICopiedJohnOswald
@ICopiedJohnOswald Ай бұрын
@@TeaLeavesProgramming A haskell function: ``` add x y = x + y ``` Is constructed internally like this: ``` add = \x -> \y -> x + y ``` or using javascript syntax cause its the universal language: ``` let add = (x) => (y) => x + y ``` Does that help?
@ICopiedJohnOswald
@ICopiedJohnOswald Ай бұрын
So `add` can be seen as a function that takes two numbers and adds them together but realy its a function that takes a number and produces another function that takes a number and then adds the two numbers. This seems odd but it ends up being really useful . For example, you can use it to do dependency injection where you partially apply your subroutines with dependencies (such as db connection strings or whatever) producing a function that recieves your more dynamic input and running the subroutine with the dependency. ie., something like: ``` getUser :: PostgresConfig -> Id -> IO User ```
@ICopiedJohnOswald
@ICopiedJohnOswald Ай бұрын
You can also write two functions that convert other functions between curried and uncurried forms. Its a pretty good exercise to try out: ``` curry :: ((x, y) -> z) -> x -> y -> z curry = undefined uncurry :: (x -> y -> z) -> (x, y) -> z uncurry = undefined ```
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Yep, great description. The book "Haskell Programming From First Principles" (which between you and me I don't really *love* but is unique in several ways) has an excellent chapter on this.
@christianreese7628
@christianreese7628 Ай бұрын
I got the game last night got lost and found 2 Murphys ghost and they ended my 1st party
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
The quintessential Wizardry experience! Remember you can go back with other characters and bring their corpses back!
@conscripto12
@conscripto12 Ай бұрын
Thanks for doing this!
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
My pleasure!
@justinbaldwin66
@justinbaldwin66 Ай бұрын
The remake plays well on Linux through steam. You just have to turn it on in the compatibility tab.
@nylaryx
@nylaryx Ай бұрын
Watching you play The Fool's Errand, it was really rewarding to see the puzzles come together most of the time, where it feels like there is a sense of accopmlishment for putting the peices together and making everything work out in the end. Not that this is lesser than that, but the arbitrary puzzles get stale very fast, (The lifts) and stay that way. Which is to say, I echo your sentiments for this one, and while it looks and sounds ahead of it's time for 1989, at least to me. The question, "Is it fun." Is seeming like a resounding "Not really."
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Well, I think that the video format is a little unfair to 3 in Three because I have a very strong incentive to NOT switch puzzles (...because I don't want to look stupid). In real play, when you start getting bored with one type of puzzle, you would just switch to another, because no one is watching and judging you. So I think it's more fun than it seems (I address this topic a bit in the second video, which I just recorded this morning
@unificialtime8360
@unificialtime8360 Ай бұрын
Apollo voiceovers in the audio stream at 25:50?
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Yes, it's from the background music by Ben Cox. I forgot that song had them 🙂
@JThor6
@JThor6 Ай бұрын
Confirming: when you switch it to Japanese it uses different kanji / words for Inspect that are much more clear. That issue was bothering me as well!
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Thank you!
@Zenas521
@Zenas521 Ай бұрын
Too bad you are not doing this game anymore. I wish I could encourage you to come back to it, but you do you.
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Part of the problem is that I played it very early, so it's updated several times and I'd have to re-do the early levels! :-)
@jaylehn4342
@jaylehn4342 Ай бұрын
If you ask me, it is the best wizardry game out there.
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
What is it about it that you enjoy, Jay?
@anonimoalfin
@anonimoalfin Ай бұрын
I loved Goblin Slayer season1. Such a pity that absurd retarded reviewbombing and utterly unjust backlash it received. I thought it was BRILLIANT how the author made goblins, and dungeon delving in general, dangerous again, like in old games like Wizardry or classic D&D. Thanks for the great Easter egg!
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
I enjoyed Goblin Slayer but I thought the first episode was so over the top it needlessly alienated a lot of people.
@anonimoalfin
@anonimoalfin Ай бұрын
Hey there again. I was looking again at your old vids on Wizardry 1 remake during Early Access (I really enjoy your vids on Wizardry and Javadry, which I came to know thanks to you!) and suddenly found this vid with the sad news and the great homage. Incredible, how time passes by… it never ceases to amaze me when people that made such a mark on the industry, and inspired a whole genre perhaps without even knowing, suddenly pass away. Thanks for sharing, your vids are much appreciated, I really enjoy your voice, knowledge and anecdotes of hardcore Wizardry playing, and how you showed all the features of the remake comparing them with the original and everything. I’d enjoy a Full Wizardry playthrough from you. Cheers and all best!
@NiDeCo
@NiDeCo Ай бұрын
You probably already noticed, but the bottom of your screen seems to barely fall off of the video, so if you're writing on the bottom line on your screen, it's not visible in the video. Good baby steps through the "mapping of things" though, very nice :)
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Yeah, I thought I had it set up right and then....didn't. I left it alone since I think the narration explained it pretty well anyway.
@amigalemming
@amigalemming Ай бұрын
I use plain text accounting in conjunction with version control systems.
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
That sounds like a lot of work!
@donaldxavier2056
@donaldxavier2056 Ай бұрын
I recently picked up the PS1 version of the game. I am a big console gamer so that is the version I am playing through. The combat is fun, exploration is great, and the soundtrack is top notch.
@Dota2RehiX
@Dota2RehiX Ай бұрын
I think you have the MOST and LEAST significant bits backwards. I believe you are treating address[6] as an array of 6 bits, reading them left to right. This WOULD imply that the most significant bit (the leftmost bit) is address[0]. This is not correct in the syntax, and the most significant bit is actually address[5]. To demonstrate this, in the web-version, when I do `Not(in=address[0], out=notZero)` and set the address to `1 0 0 0 0 0`, it outputs `notZero=1`. And when I set the address to `0 0 0 0 0 1`, it outputs `notZero=0`. The tests still pass in your code, but if you switch the least and most significant bits in all of your examples, the tests also still pass.
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Thank you for the correction!
@Dota2RehiX
@Dota2RehiX Ай бұрын
@@TeaLeavesProgramming Thank you for the series. I'm a Java developer and after about a decade of programming professionally, it finally occurred to me that it would be nice to understand the layers of complexity I've been standing on all this time. It's really easy to use those layers as a black box, not appreciate them, and forget the fact that you're standing on the shoulders of giants.
@CamUri_Productions
@CamUri_Productions Ай бұрын
Hi from Europe, Spain, Pete! This may be a weird comment, but I think there is something about Wizardry that's very "Alien", from 1979. I think it's the dark mysterious (and sometimes even scary) atmosphere present on all the wizardry main games (even 7 or 8). I wonder if the movie itself inspired the developers. Thanks for the video btw, there is something very chilling about the way you present your content!
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Thank you for your kind words! Me encanta España y tengo muchos buenos recuerdos de Madrid. One of my favorite bits from the "Blade & B*stard" light novels that came out last year (which take place in an unlicensed version of the Wizardry universe) is the revelation that the main character sees the dungeon as black and white wireframe.
@anonimoalfin
@anonimoalfin Ай бұрын
Never heard about the "Blade & B*stard" light novels, but they sound wonderful! Already read The Witcher books too many times, and was looking for something else. This sounds very interesting! Thx for the heads up!
@literallybooks
@literallybooks Ай бұрын
A very nice tribute. Really enjoy all your wizardry coverage.
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Thank you kindly!
@chipschap
@chipschap Ай бұрын
Excellent. While PTA meets my needs and I use it exclusively, the video makes good points in a non-argumentative manner. PTA for instance certainly doesn't scale to large businesses. But for my uses--- to keep the books for small non-profits with minimal accounts receivable, as well as relatively uncomplicated personal finance--- it's just great. Ledger integrates with Emacs and it's all a breeze. The video is also correct about this being a terrific learning tool for double-entry accounting. As a side note, I was happy to see that the alternative shown, GnuCash, is free open-source software.
@SeasonPlace
@SeasonPlace Ай бұрын
That is sad. It was written in Pascal and had many elements of D&D. Wizardry was the game that got me into the game industry. May he rest in peace.
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
It was an incredibly complex program for the early 8-bit era!
@darrelllarue5877
@darrelllarue5877 Ай бұрын
it was a great time for games and influenced a lot of future games
@theedxqboi
@theedxqboi Ай бұрын
Thank you for this tribute. Not a game I played or even heard of, but those old games are some of my favorite memories from my childhood.
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Same!
@benjaminfjones
@benjaminfjones 2 ай бұрын
Excited for lvl 4!
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
It's currently live for early-access members (and has been for a while, actually!) but should go live in October for the general public.
@adityagarg6734
@adityagarg6734 2 ай бұрын
thanks for nand2tetris videos
@TeaLeavesProgramming
@TeaLeavesProgramming Ай бұрын
Glad you like them!