SoftwareMill
SoftwareMill
  • 236
  • 331 628
Tapir Tutorial - part 7: Integration with cats-effect & http4s | Adam Warski SoftwareMill
Tapir: rapid development of self-documenting HTTP APIs
We've seen how to use Tapir in combination with direct-style, but one of Tapir's main strengths is that it integrates with virtually every Scala stack out there. This means, first and foremost, cats-effect for describing side-effecting computations, and http4s as an HTTP server. We'll include, of course, generating OpenAPI docs!
RESOURCES
* This tutorial as text: tapir.softwaremill.com/en/latest/index.html
* Tapir on GitHub: github.com/softwaremill/tapir
* cats-effect: github.com/typelevel/cats-effect
* http4s: http4s.org
CHAPTERS
00:00 Describing the demo endpoint
01:42 Purely functional server logic
03:26 Signature of the server logic
04:30 Adding the server logic
07:35 Exposing the endpoint
09:00 http4s server interpreter
11:00 Starting the server
15:40 Running & testing
16:23 Exposing OpenAPI documentation
20:00 More testing
20:40 Recap
ALL TUTORIALS PLAYLIST
czcams.com/video/WV1bZaGrdQQ/video.html
zhlédnutí: 288

Video

Tapir Tutorial - part 6: Error Variants | Adam Warski SoftwareMill
zhlédnutí 255Před 2 měsíci
Tapir: rapid development of self-documenting HTTP APIs When many things might go wrong, or right - describing success & errors outputs with many variants RESOURCES * This tutorial as text: tapir.softwaremill.com/en/latest/tutorials/06_error_variants.html * Tapir on GitHub: github.com/softwaremill/tapir CHAPTERS 00:00 Introduction 00:50 Recap on error outputs 02:26 Response variants 04:22 High-l...
Tapir Tutorial - part 5: Multiple inputs & outputs | Adam Warski SoftwareMill
zhlédnutí 232Před 2 měsíci
Tapir: rapid development of self-documenting HTTP APIs How to add and handle multiple inputs & outputs on an endpoint? RESOURCES * This tutorial as text: tapir.softwaremill.com/en/latest/tutorials/05_multiple_inputs_outputs.html * Tapir on GitHub: github.com/softwaremill/tapir CHAPTERS 00:00 Multiple inputs & outputs 00:46 Describing the endpoint 03:20 Extracting multiple values from HTTP reque...
Tapir Tutorial - part 4: Error Handling | Adam Warski SoftwareMill
zhlédnutí 341Před 2 měsíci
Tapir: rapid development of self-documenting HTTP APIs In this episode we'll see the basics of error handling. RESOURCES * This tutorial as text: tapir.softwaremill.com/en/latest/tutorials/04_errors.html * Tapir on GitHub: github.com/softwaremill/tapir CHAPTERS 00:00 Expected & unexpected errors 02:10 Describing the endpoint with error outputs 05:35 Adding server logic with Either 07:40 Testing...
Beyond ChatGPT: AI chatbots made easy
zhlédnutí 145Před 2 měsíci
In this tutorial, Rafał, our ML expert, walks you through the concept and implementation details of bespoke LLM solutions. Learn more: ⭐️ softwaremill.com/services/bespoke-ai-chatbot-for-your-business/ ⭐️ www.reasonfieldlab.com/
Tapir Tutorial - part 3: Using JSON bodies | Adam Warski SoftwareMill
zhlédnutí 488Před 2 měsíci
Tapir: rapid development of self-documenting HTTP APIs In this episode we'll see how to integrate with JSON: parse incoming HTTP requests and serialise outgoing HTTP responses. Along with generating documentation, in a type-safe, programmer-friendly way! RESOURCES * This tutorial as text: tapir.softwaremill.com/en/latest/tutorials/03_json.html * Tapir on GitHub: github.com/softwaremill/tapir * ...
Tapir Tutorial - part 2: Generating OpenAPI docs | Adam Warski SoftwareMill
zhlédnutí 557Před 3 měsíci
Tapir: rapid development of self-documenting HTTP APIs Welcome back! In this episode we'll add auto-generated OpenAPI docs, and browse them using the Swagger editor. We'll also start uncovering some details of how Tapir integrates with various Scala stacks. RESOURCES * This tutorial as text: tapir.softwaremill.com/en/latest/tutorials/02_openapi_docs.html * Tapir on GitHub: github.com/softwaremi...
Paweł Kołodziejczyk LOOKING BEYOND THE SCOPE: SCALA APPLICATION FROM AN EXTERNAL LENS Scalar 2024
zhlédnutí 226Před 3 měsíci
In the dynamic landscape of Scala application development, the tendency to focus solely on internal intricacies often obscures a crucial aspect - how the application is perceived from the outside. By observing from a distance, we gain insights into how to enhance resilience, reliability, and overall performance, influencing how we implement our applications. Questions arise: What's the startup ...
Tapir Tutorial - part 1: Hello, world! | Adam Warski SoftwareMill
zhlédnutí 1KPřed 3 měsíci
Tapir: rapid development of self-documenting HTTP APIs How to start your adventure with Tapir? How can a functional programming language, such as Scala, benefit your daily work as a programmer? In the tutorial, we'll setup a simple project, and expose a single endpoint. You *should* try this at home :) RESOURCES * This tutorial as text: tapir.softwaremill.com/en/latest/tutorials/01_hello_world....
David Amancio Gil Mendez DIAMOND ARCHITECTURE: LESSONS LEARNED Scalar Conference 2024
zhlédnutí 323Před 3 měsíci
The talk explores the recursive structure of Diamond Architecture. It also covers the application of the Tagless Final pattern when necessary. The presentation adheres to maximum cohesion principles and strategically uses tools. You will leave with the knowledge and strategies needed to successfully navigate the complexities of large codebases. We will discuss the importance of using the Tagles...
Mehmet Akif Tütüncü DO I MISS WRITING SCALA? Scalar Conference 2024
zhlédnutí 592Před 3 měsíci
"I've had the please of working with Scala for many years, as well as other main JVM languages like Java and Kotlin. In this talk, I'd like to reflect on these experiences, what I like/dislike about Scala (and other languages), how certain decisions have affected projects, how these languages have changed over time and how they address different problems. Join me for a fun and possibly opiniona...
Raphael Lemaitre ARMORED TYPE SAFETY WITH IRON Scalar Conference 2024
zhlédnutí 278Před 3 měsíci
When designing an application, we often end up with domain-specific types, that all behold constraints that we try to enforce as much as possible : an age is positive, a delivery date can’t be in the past, etc. Modelling the data right is a part of the success of Scala and functional programming in general, but it also brings either boilerplate (we have to do again and again validation), or rel...
JOX - Passing Control Information Through Channels, Adam Warski SoftwareMill
zhlédnutí 232Před 3 měsíci
Let's examine some use cases, where the unique features of Jox make a difference! We'll transfer data from a websocket to a stream of messages, considering two cases: when the control data (errors, web socket completion) is carried alongside the data, and on a separate channel. The above can be cleanly implemented thanks to the availability of the `select` operation, and the possibility of comp...
Jamie Thompson MIRRORS FOR OPERATIONS, NOT DATA Scalar Conference 2024
zhlédnutí 430Před 3 měsíci
Can we derive endpoints from just a trait definition? One of Scala's strengths is domain modelling, and from a data definition, we can derive generic information in a Mirror, e.g. to generate type classes. For operations (such as endpoints) there is less support from metaprogramming, so we often create DSLs to describe them. I propose that we can extend Mirrors to operations, and use the most n...
Wojciech Mazur IMPLEMENTING MULTITHREADING IN SCALA NATIVE Scalar Conference 2024
zhlédnutí 498Před 3 měsíci
One of the core Scala domains is scalable, concurrent, or parallel data processing, which typically at some point is powered by JVM Threads. However, the Scala Native - an ahead-of-time compiler and runtime for Scala, was for a long time limited to only a single thread of execution. At first glance, it might have sounded like it a not a big deal. Starting system threads is easy...but then, sudd...
Nguyen Pham STRUCTURED CONCURRENCY IN DIRECT STYLE WITH GEARS Scalar Conference 2024
zhlédnutí 605Před 3 měsíci
Nguyen Pham STRUCTURED CONCURRENCY IN DIRECT STYLE WITH GEARS Scalar Conference 2024
Jacek Kunicki GROWING OXEN: CHANNEL OPERATORS AND RETRIES Scalar Conference 2024
zhlédnutí 202Před 3 měsíci
Jacek Kunicki GROWING OXEN: CHANNEL OPERATORS AND RETRIES Scalar Conference 2024
Iulian Dragos Faster and less mysterious sbt builds with Develocity Lightning talk Scalar 2024
zhlédnutí 209Před 3 měsíci
Iulian Dragos Faster and less mysterious sbt builds with Develocity Lightning talk Scalar 2024
Paul Matthews SOUNDS OF SCALA.JS Scalar Conference 2024
zhlédnutí 276Před 3 měsíci
Paul Matthews SOUNDS OF SCALA.JS Scalar Conference 2024
Jakub Kozłowski FORAGING INTO EMBEDDED LANDS - THE PATH TO WRITING PLAYDATE GAMES WITH SCALA Scalar
zhlédnutí 471Před 3 měsíci
Jakub Kozłowski FORAGING INTO EMBEDDED LANDS - THE PATH TO WRITING PLAYDATE GAMES WITH SCALA Scalar
Kamil Kloch TURBOCHARGING WEB SOCKET INTEGRATION FOR TAPIR Scalar Conference 2024
zhlédnutí 224Před 3 měsíci
Kamil Kloch TURBOCHARGING WEB SOCKET INTEGRATION FOR TAPIR Scalar Conference 2024
Michał Pawlik HOW SLOW IS YOUR TRAM Scalar Conference 2024
zhlédnutí 310Před 3 měsíci
Michał Pawlik HOW SLOW IS YOUR TRAM Scalar Conference 2024
JOX - Virtual-thread-friendly go-like channels for Java, Adam Warski SoftwareMill
zhlédnutí 484Před 3 měsíci
JOX - Virtual-thread-friendly go-like channels for Java, Adam Warski SoftwareMill
Daniel Ciocîrlan GENERATIVE ART WITH SCALA, NO AI REQUIRED Scalar Conference 2024
zhlédnutí 505Před 3 měsíci
Daniel Ciocîrlan GENERATIVE ART WITH SCALA, NO AI REQUIRED Scalar Conference 2024
Nicolas Rinaudo THE DEBATABLY FREE MONAD Scalar Conference 2024
zhlédnutí 593Před 4 měsíci
Nicolas Rinaudo THE DEBATABLY FREE MONAD Scalar Conference 2024
Łukasz Biały HANDS-ON BESOM: INFRASTRUCTURE-AS-A-CODE WITH SCALA Scalar Conference 2024
zhlédnutí 271Před 4 měsíci
Łukasz Biały HANDS-ON BESOM: INFRASTRUCTURE-AS-A-CODE WITH SCALA Scalar Conference 2024
Martin Duhem EXPLORING BUILD CACHING: A PRACTICAL OVERVIEW Scalar Conference 2024
zhlédnutí 202Před 4 měsíci
Martin Duhem EXPLORING BUILD CACHING: A PRACTICAL OVERVIEW Scalar Conference 2024
Sophie Collard CONTRAVARIANCE: INTUITION BUILDING AND EXAMPLES Scalar Conference 2024
zhlédnutí 354Před 4 měsíci
Sophie Collard CONTRAVARIANCE: INTUITION BUILDING AND EXAMPLES Scalar Conference 2024
Czego Frontendzi mogą się nauczyć z gier komputerowych?
zhlédnutí 127Před 4 měsíci
Czego Frontendzi mogą się nauczyć z gier komputerowych?
Tomasz Godzik SCALA TOOLING ECOSYSTEM Scalar Conference 2024
zhlédnutí 519Před 4 měsíci
Tomasz Godzik SCALA TOOLING ECOSYSTEM Scalar Conference 2024

Komentáře

  • @AreHusby
    @AreHusby Před 12 dny

    He says something about modules, that they are important but that people don't understand them. I'm one of those people. Where can I learn what he means by that?

  • @abhijit-sarkar
    @abhijit-sarkar Před 24 dny

    11:14 - Why mention Rust, Rust is horrible. "I shall makest thy life unbearable by promising to solve the problems that thou dost not hast".

  • @user-gf8bh9fy8r
    @user-gf8bh9fy8r Před 27 dny

    I agree the documentation is already top notch

  • @darrenkim8301
    @darrenkim8301 Před 28 dny

    Simply, Contravariance is for input, Covariance is for output. That was very helpful for understanding contravariance. Thank you!

  • @eg4933
    @eg4933 Před měsícem

    Scala is actually the best. Industry hasn't caught yet.

    • @slizzardshroomer9666
      @slizzardshroomer9666 Před 7 dny

      I wouldn't say the best but it's one of the best.

    • @eg4933
      @eg4933 Před 7 dny

      @@slizzardshroomer9666 all they literally have to do is get low-level features like pointers etc included. Then you pretty much replace c++ by 95% and be far more accessible and productive than in c++. Because c++ was when hardware/storage was very limited, not the case anymore.

  • @HelloForeignWorld
    @HelloForeignWorld Před měsícem

    An idea for another video: Can you show how to extend this application to have some dependency injection / context? I understand this will not be “Tapir only” video, but it will help people bridge the gap between theoretical use of Tapir and a real world use of it

  • @HelloForeignWorld
    @HelloForeignWorld Před 2 měsíci

    In 18:00, wouldn’t it work if you use “AvatarError.Unauthorized.type” 🤔

  • @jay-hinddoston8364
    @jay-hinddoston8364 Před 2 měsíci

    I am planning to use this with zio http

  • @heck_fy
    @heck_fy Před 2 měsíci

    good overview, thank you very much!)

  • @rockthejvm
    @rockthejvm Před 2 měsíci

    The final effect is at 30:29 - automatic edge detection and a nice message - enjoy!

  • @HelloForeignWorld
    @HelloForeignWorld Před 2 měsíci

    Nice, I didn’t know there is a mapInto macro 😮

  • @ReidMewborne
    @ReidMewborne Před 2 měsíci

    Again, so good!

  • @HelloForeignWorld
    @HelloForeignWorld Před 2 měsíci

    Idea for the next video: How can you express multiple error types and especially if you want to combine different errors in an ad-hoc manner using a untagged union.

  • @AnatolyKosorukov
    @AnatolyKosorukov Před 2 měsíci

    This is why I love my job! Mentally with you!

  • @avalagum7957
    @avalagum7957 Před 2 měsíci

    How do we write logging messages in Scala? I'm not expecting answers like "what's wrong with logback? log4j? ..." as I know that we can use Java libraries in Scala. I'd like to know the common/popular ways to do that in Scala.

    • @AdamWarski2
      @AdamWarski2 Před 2 měsíci

      There are dedicated logging libraries for Scala, but most of the time you can simply use slf4j. It works just fine. So logback it is :)

  • @GVLPedro
    @GVLPedro Před 2 měsíci

    Thank you!, I would like to know how authenticate endpoints

  • @adrianabreu1565
    @adrianabreu1565 Před 2 měsíci

    This really adds a lot of value, we're missing a lot of clear explanations such as this one in the ecosystem! Thanks for all your work :)

  • @ReidMewborne
    @ReidMewborne Před 3 měsíci

    I love this so much!

  • @HelloForeignWorld
    @HelloForeignWorld Před 3 měsíci

    Great tutorial. Is there a way to describe websocket messages with OpenAPI, or how would you go about it?

  • @nicolaenmv
    @nicolaenmv Před 3 měsíci

    I find this tutorial excellent. Anyone looking to build an API and having swagger documentation will surely find this useful. Great work!

  •  Před 3 měsíci

    Sadly the nausea causing bass sound from typing I commented about on the first video still persists :(. Separating the microphone from the desk would be one way to get rid of that.

    • @SoftwareMillCom
      @SoftwareMillCom Před 3 měsíci

      Thanks for the advice, we're gonna try to do something with this

    •  Před 3 měsíci

      @@SoftwareMillCom Thank you! I'm very interested in this series and would love to be able to listen future videos :)

  • @TJ-hs1qm
    @TJ-hs1qm Před 3 měsíci

    Lerp function (Freya Holmé) czcams.com/video/LSNQuFEDOyQ/video.html

  • @yaroslavsydorenko
    @yaroslavsydorenko Před 3 měsíci

    Wow! Great! I will try tapir 🎉

  •  Před 3 měsíci

    I would be interested of a series for tapir, but before that I'd suggest separating the microphone from the desk, or adding dampening for the microphone, as in this video your typing causes low bass sounds that make at least me nauseous. I wasn't able to watch anymore after you started working on the code :(

    •  Před 3 měsíci

      (or maybe just run the audio through a high pass filter on the editor?)

  • @sevenxym
    @sevenxym Před 3 měsíci

    Adam, great work! Already using tapir and it is such a lovely tool. It is making Scala world richer. The learning curve of the library is low but also allows for advanced usage. Having different options for servers, clients and almost built in Swagger UI integration makes writing HTTP API very simple. Thank you for such great set of libraries!

  • @avalagum7957
    @avalagum7957 Před 3 měsíci

    Why does your IntelliJ not show any code hint (i.e. the arguments of a method, the methods in a class ...)? I think IntelliJ already supports scala cli? You can go at a faster pace and put more examples (at least, that's what I like. If I like it, thousands of Joe developers like me will like it too). For example (this is what I copy from Spring), how to make the query parameter optional, if the query parameter is missing, can I give it a default value, does tapir help converting the string value of a query parameter to another type that I specify, how to catch all the query parameters even when I don't declare all of them ... If tapir can provide all the features Spring has, ... well I don't know what will happen then :)

    • @sevenxym
      @sevenxym Před 3 měsíci

      scala-cli can generate IntelliJ project files and integrate via BSP to scala-cli. So this part works well enough. Once you have this configured, just use the power of a typed language like Scala and code hint suggestions from IDE to explore what the APIs are and play around with the framework. how to make the query parameter optional? -> query[Option[String]]("name"). can I give it a default value? Yes! query[String]("name").default("John"). does tapir help converting the string value of a query parameter to another type. Also, yes. you can define a query parameter for any type. But you will have to provide `Codec` that will do mapping from primitive values to your own type. Most standard types are already covered by tapir

    • @AdamWarski2
      @AdamWarski2 Před 3 měsíci

      I didn't have the scala-cli file imported as a project - hence there were no completions. Not because of any special reason, just didn't need it for the video :). As for the pace, thanks for the feedback, I'll see what the general perception is.

  • @HelloForeignWorld
    @HelloForeignWorld Před 3 měsíci

    Great idea! I hope there are more video tutorials on Tapir 💡

  • @somasundaramvalliappan3851
    @somasundaramvalliappan3851 Před 3 měsíci

    Please continue this series n keep going, thanks a lot for the video

  • @DevInsideYou
    @DevInsideYou Před 3 měsíci

    Thank You!

  • @ikbo
    @ikbo Před 3 měsíci

    Scala is a beautiful language at its core especially v3. Too bad it was made complicated and esoteric and as a result lost mindshare among developers. Scala 3 should have been a different language with different branding and not tied to JVM. Unfortunately they constrained themselves with the technical debt of old Scala. How sad 😢

  • @avalagum7957
    @avalagum7957 Před 3 měsíci

    You worked with Java from 2011 - 2013: that means 2 years with Java 6/7 (java 8 was released Mar 2014). That also means you might not know much about the current java language features. You use Scala in your personal projects: I guess you're up to date with Scala. You're using Kotlin at work, you must be pretty good at Kotlin. Looking at your Scala example, I'm not sure how many spaces you use for 1 indentation. Sometimes 3, some other times 4? IMO, it's a magic if your Scala 3 example at 7:53 compiles.

  •  Před 3 měsíci

    Hello. I would like to apply similar pattern to run Akka Persistence on AWS Lambda? Don't you have a code snippet you can share with us?

  • @TJ-hs1qm
    @TJ-hs1qm Před 3 měsíci

    4:54 counting 20 people in the audience

    • @SoftwareMillCom
      @SoftwareMillCom Před 3 měsíci

      It's a huge auditorium for 480 people, we had almost 300 participants + there's a better view from the back ;)

  • @Jankoekepannekoek
    @Jankoekepannekoek Před 3 měsíci

    I am quite surprised this could be done without a change in the compiler! I suppose the 'derived' method on the typeclass' companion object has no restriction on the type of the first argument then.

    • @jamie_thompson_
      @jamie_thompson_ Před 3 měsíci

      you're right, "derives Foo" really has only one restriction, that Foo has 1 type parameter. The desugaring is very flexible, it's up to the "derived" method to impose any restrictions. For example, if you ask for a scala.deriving.Mirror evidence, then the compiler enforces some rules before it will synthesize a mirror for you.

    • @Jankoekepannekoek
      @Jankoekepannekoek Před 3 měsíci

      @@jamie_thompson_ Good to know! Thanks!

  • @senthilkumarm4063
    @senthilkumarm4063 Před 3 měsíci

    Thanks for this talk. Great Engineering !

  • @AlexRodriguez-gb9ez
    @AlexRodriguez-gb9ez Před 3 měsíci

    What about having monads/arrows/applicatives be "hidden" say by the eval function so that you are inside the monad at the start, but you can change the current monad using let/where

  • @avalagum7957
    @avalagum7957 Před 3 měsíci

    Hi Nguyen, you're just at the 2nd year of your phd program but you already went through Rust, Nodejs and Go. How much time did you spend on each of them?

  • @olegmirzov
    @olegmirzov Před 3 měsíci

    Nice talk, understandable code!

  • @pengcheng8299
    @pengcheng8299 Před 3 měsíci

    great demo, can it be open-sourced?

  • @OMGSirius
    @OMGSirius Před 3 měsíci

    Great work m8!

  • @avalagum7957
    @avalagum7957 Před 3 měsíci

    Another question: why is Jox pretty slower than the Kotlin channel when they both use the same design? Is it possible that the jvm bytecode generated by Kotlin is better than the one generate by javac?

    • @AdamWarski2
      @AdamWarski2 Před 3 měsíci

      Great question! :) There might be several reasons: 1. the runtime is different. In Kotlin, the compiler transforms code which has suspendable functions into a finite state machine. That's known as a continuation-passing-style (CPS) transform. Then, Kotlin's coroutine runtime manages multiplexing of running subsequent steps in the evaluation of these state machine, onto a finite thread pool. In Java 21, when we run on a virtual thread and encounter a blocking operation, there's might be a context switch of the virtual thread that is running; this involves stashing the current stack trace on the side, restoring another one, and resuming this other virtual thread. Even if the effects are similar, both mechanisms are different, and might have different performance characteristics. 2. the differences aren't *that* big (we're talking about 9ns and 14ns), and the benchmark might be simply skewed. Another benchmark might give different results. The main take-away from the benchmark is that all implementations have very good performance - that is, we didn't screw up in jox, or Kotlin didn't screw up comparing to Go.

  • @eklok5000
    @eklok5000 Před 3 měsíci

    While I really like scala, I don’t get why someone would like to do this. I am missing the motivation part at the beginning of the talk - is it something else other than just having fun and showing that it is possible? And as a side note: why did you upload the video in such a format @Scalar conference organizers?! It is really hard to see anything on the code part. Make it full screen next time please

  • @avalagum7957
    @avalagum7957 Před 4 měsíci

    So select gives us the result of the 1st completed task (if there are n tasks, each of them must have its own channel, right?). Will it cancel other tasks when 1 task finishes?

    • @AdamWarski2
      @AdamWarski2 Před 4 měsíci

      Yes, you pass N clauses to the `select` method. The 1st one that can be completed (either immediately, or after blocking) will be the result of the `select`. All other clauses are cancelled, and that's the whole point: *exactly* one clause will be completed. Each clause must correspond to a different channel, yes, otherwise you'll get an exception.

    • @avalagum7957
      @avalagum7957 Před 4 měsíci

      @@AdamWarski2 how about the cancelation? Will other tasks be canceled when one task completes?

    • @AdamWarski2
      @AdamWarski2 Před 4 měsíci

      @@avalagum7957 Yes, if by "task" you mean the clauses that are passed to the `select`. So if you have `select(ch1.receiveClause(), ch2.receiveClause())`, and a value is received from `ch1`, the "task" represented by `ch2.receiveClause()` will be cancelled, and it's guaranteed that it won't receive a value from `ch2`.

  • @DinoFancellu
    @DinoFancellu Před 4 měsíci

    Does this work ok in Scala 2/3, given the correct JDK?

    • @Jankoekepannekoek
      @Jankoekepannekoek Před 4 měsíci

      It's a Java library, so it's independent of the Scala version.

    • @AdamWarski2
      @AdamWarski2 Před 4 měsíci

      As already mentioned, it works with Scala 2 and 3, requires JDK 17+. Jox is also used in the Scala Ox library.

  • @jmgimeno
    @jmgimeno Před 4 měsíci

    Amazing. Thanks !!!

  • @zxyi9090
    @zxyi9090 Před 4 měsíci

    😂

  • @zxyi9090
    @zxyi9090 Před 4 měsíci

    We are in a chainable simulation with infinite possibilities

  • @pyepye-io4vu
    @pyepye-io4vu Před 4 měsíci

    The video description is wrong! It's for another video about ScalaPy.

  • @jordanzimmerman7590
    @jordanzimmerman7590 Před 4 měsíci

    I’ve never understood Martin’s use of “simple” when describing Scala. There is nothing simple about Scala.

    • @joan38
      @joan38 Před měsícem

      What part is complex to you?

    • @jordanzimmerman7590
      @jordanzimmerman7590 Před měsícem

      @@joan38 To ask that question is to admit that I won't ever convince you. The complexity is baked in from the beginning. I remember trying to work through the very first examples from Odersky's original Scala course. Odersky chose college level math concepts and glossed over them as if everyone would understand. I never went to college. This one anecdote reveals why Scala is perceived as complex by so many of us. It's like a professional musician not understanding why most people think playing their instrument is hard. I spent 2 years writing Scala professionally. Every day with it was a grind of waiting for the slow, buggy complier; dealing with the odious incomprehensible sbt, debugging implicits, trying to fathom the impenetrable standard library (which, itself, is hopelessly complex). Most dev's impression of Scala is that it's complex. It's not a rare belief.

  • @6qat
    @6qat Před 4 měsíci

    Unfortunately the wokeness destroyed Scala.