(Video and code available at http://fsharpforfunandprofit.com/turtle)
In this fast-paced talk, I'll start with the well known API for turtle graphics, and then stretch it to the breaking point by creating 13 different implementations, each demonstrating a different functional programming technique.
Along the way, we'll use partial application, functional dependency injection, validation
with Success/Failure results, the Either monad, the State monad, agents with message queues, event sourcing, stream processing, capability-based design, and the interpreter pattern (aka free monad). Phew!
The lazy programmer's guide to writing thousands of testsScott Wlaschin
We are all familiar with example-based testing, as typified by TDD and BDD, where each test is hand-crafted.
But there's another approach to writing tests. In the "property-based testing" approach, a single test is run hundreds of times with randomly generated inputs. Property-based testing is a great way to find edge cases, and also helps you to understand and document the behavior of your code under all conditions.
This talk will introduce property-based testing, show you how it works, and demonstrate why you should consider adding this powerful technique to your toolbelt.
Functional Programming Patterns (NDC London 2014)Scott Wlaschin
(video of these slides available here http://fsharpforfunandprofit.com/fppatterns/)
In object-oriented development, we are all familiar with design patterns such as the Strategy pattern and Decorator pattern, and design principles such as SOLID.
The functional programming community has design patterns and principles as well.
This talk will provide an overview of some of these, and present some demonstrations of FP design in practice.
Video and more content at fsharpforfunandprofit.com/pbt
"The lazy programmer's guide to writing 1000's of tests: An introduction to property based testing"
We are all familiar with example-based testing, as typified by TDD and BDD. Property-based testing takes a very different approach, where a single test is run hundreds of times with randomly generated inputs.
Property-based testing is a great way to find edge cases, and also helps you to understand and document the behaviour of your code under all conditions.
This talk will introduce property-based testing and show how it works, and why you should consider adding it to your arsenal of testing tools.
(Video available at http://fsharpforfunandprofit.com/monadster/)
You've got a pile of assorted functions lying around. Each one is useful and reliable, but they just don't fit together properly. How can you assemble them into a complete system that can stand on its own two feet and terrorize the local villagers?
In this session, I'll show how functional programming can transform all sorts of existing code into shapes that are plug-compatible and which can be bolted together effortlessly.
SAFETY NOTE: The techniques demonstrated are perfectly harmless and can even be used at your workplace -- no lightning bolts required.
(Video and code at http://fsharpforfunandprofit.com/composition)
Composition is a fundamental principle of functional programming, but how is it different from an object-oriented approach, and how do you use it in practice?
In this talk for beginners, we'll start by going over the basic concepts of functional programming, and then look at some different ways that composition can be used to build large things from small things.
After that, we'll see how composition is used in practice, beginning with a simple FizzBuzz example, and ending with a complete (object-free!) web application.
The Functional Programming Toolkit (NDC Oslo 2019)Scott Wlaschin
(slides and video at https://fsharpforfunandprofit.com/fptoolkit)
The techniques and patterns used in functional programming are very different from object-oriented programming, and when you are just starting out it can be hard to know how they all fit together.
In this big picture talk for FP beginners, I'll present some of the common tools that can be found in a functional programmer's toolbelt; tools such as "map", "apply", "bind", and "sequence". What are they? Why are they important? How are they used in practice? And how do they relate to scary sounding concepts like functors, monads, and applicatives?
Composition is a fundamental principle of functional programming, but how is it different from an object-oriented approach, and how do you use it in practice?
In this talk for beginners, we'll start by going over the basic concepts of functional programming, and then look at some different ways that composition can be used to build large things from small things.
After that, we'll see how composition is used in practice, beginning with a simple FizzBuzz example, and ending with a complete (object-free!) web application.
The lazy programmer's guide to writing thousands of testsScott Wlaschin
We are all familiar with example-based testing, as typified by TDD and BDD, where each test is hand-crafted.
But there's another approach to writing tests. In the "property-based testing" approach, a single test is run hundreds of times with randomly generated inputs. Property-based testing is a great way to find edge cases, and also helps you to understand and document the behavior of your code under all conditions.
This talk will introduce property-based testing, show you how it works, and demonstrate why you should consider adding this powerful technique to your toolbelt.
Functional Programming Patterns (NDC London 2014)Scott Wlaschin
(video of these slides available here http://fsharpforfunandprofit.com/fppatterns/)
In object-oriented development, we are all familiar with design patterns such as the Strategy pattern and Decorator pattern, and design principles such as SOLID.
The functional programming community has design patterns and principles as well.
This talk will provide an overview of some of these, and present some demonstrations of FP design in practice.
Video and more content at fsharpforfunandprofit.com/pbt
"The lazy programmer's guide to writing 1000's of tests: An introduction to property based testing"
We are all familiar with example-based testing, as typified by TDD and BDD. Property-based testing takes a very different approach, where a single test is run hundreds of times with randomly generated inputs.
Property-based testing is a great way to find edge cases, and also helps you to understand and document the behaviour of your code under all conditions.
This talk will introduce property-based testing and show how it works, and why you should consider adding it to your arsenal of testing tools.
(Video available at http://fsharpforfunandprofit.com/monadster/)
You've got a pile of assorted functions lying around. Each one is useful and reliable, but they just don't fit together properly. How can you assemble them into a complete system that can stand on its own two feet and terrorize the local villagers?
In this session, I'll show how functional programming can transform all sorts of existing code into shapes that are plug-compatible and which can be bolted together effortlessly.
SAFETY NOTE: The techniques demonstrated are perfectly harmless and can even be used at your workplace -- no lightning bolts required.
(Video and code at http://fsharpforfunandprofit.com/composition)
Composition is a fundamental principle of functional programming, but how is it different from an object-oriented approach, and how do you use it in practice?
In this talk for beginners, we'll start by going over the basic concepts of functional programming, and then look at some different ways that composition can be used to build large things from small things.
After that, we'll see how composition is used in practice, beginning with a simple FizzBuzz example, and ending with a complete (object-free!) web application.
The Functional Programming Toolkit (NDC Oslo 2019)Scott Wlaschin
(slides and video at https://fsharpforfunandprofit.com/fptoolkit)
The techniques and patterns used in functional programming are very different from object-oriented programming, and when you are just starting out it can be hard to know how they all fit together.
In this big picture talk for FP beginners, I'll present some of the common tools that can be found in a functional programmer's toolbelt; tools such as "map", "apply", "bind", and "sequence". What are they? Why are they important? How are they used in practice? And how do they relate to scary sounding concepts like functors, monads, and applicatives?
Composition is a fundamental principle of functional programming, but how is it different from an object-oriented approach, and how do you use it in practice?
In this talk for beginners, we'll start by going over the basic concepts of functional programming, and then look at some different ways that composition can be used to build large things from small things.
After that, we'll see how composition is used in practice, beginning with a simple FizzBuzz example, and ending with a complete (object-free!) web application.
Introduces the functional programming ideas of Functor, Apply, Applicative And Monad. Shows how to implement each in Scala with Scalaz and how to validate the implementation using property based test using specs2 and scalacheck.
(Video and code at https://fsharpforfunandprofit.com/pipeline/)
Passing data through a pipeline of transformations is an alternative approach to classic OOP. The LINQ methods in .NET are designed around this, but the pipeline approach can be used for so much more than manipulating collections.
In this talk, I'll look at pipeline-oriented programming and how it relates to functional programming, the open-closed principle, unit testing, the onion architecture, and more. I'll finish up by showing how you can build a complete web app using only this approach.
Video and related blog posts at fsharpforfunandprofit.com/ettt
Follow along as I ridiculously over-engineer a simple game to demonstrate how functional programming can be used to create a real-world "enterprise-ready" application.
Topics covered include: encoding business rules into types, data hiding with parametric polymorphism, using functions for capability-based security, exposing a REST API with HATEAOS, the functional approach to logging, actors, scalability and more.
(video and more at http://fsharpforfunandprofit.com/fppatterns)
In object-oriented development, we are all familiar with design patterns such as the Strategy pattern and Decorator pattern, and design principles such as SOLID. The functional programming community has design patterns and principles as well. This talk will provide an overview of some of these patterns (such as currying, monads), and present some demonstrations of FP design in practice. We'll also look at some of the ways you can use these patterns as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary.
(Video of these slides here http://fsharpforfunandprofit.com/rop)
(My response to "this is just Either" here: http://fsharpforfunandprofit.com/rop/#monads)
Many examples in functional programming assume that you are always on the "happy path". But to create a robust real world application you must deal with validation, logging, network and service errors, and other annoyances.
So, how do you handle all this in a clean functional way? This talk will provide a brief introduction to this topic, using a fun and easy-to-understand railway analogy.
The Functional Programmer's Toolkit (NDC London 2019)Scott Wlaschin
(slides and video at https://fsharpforfunandprofit.com/fptoolkit)
The functional programming community has a number of patterns with strange names such as monads, monoids, functors, and catamorphisms.
In this beginner-friendly talk, we'll demystify these techniques and see how they all fit together into a small but versatile "tool kit".
We'll then see how the tools in this tool kit can be applied to a wide variety of programming problems, such as handling missing data, working with lists, and implementing the functional equivalent of dependency injection.
Nat, List and Option Monoids -from scratch -Combining and Folding -an examplePhilip Schwarz
Nat, List and Option Monoids, from scratch. Combining and Folding: an example.
Code: https://github.com/philipschwarz/nat-list-and-option-monoids-from-scratch-combining-and-folding-an-example
(video of these slides available here http://fsharpforfunandprofit.com/fppatterns/)
In object-oriented development, we are all familiar with design patterns such as the Strategy pattern and Decorator pattern, and design principles such as SOLID.
The functional programming community has design patterns and principles as well.
This talk will provide an overview of some of these, and present some demonstrations of FP design in practice.
Blazing Fast, Pure Effects without Monads — LambdaConf 2018John De Goes
Effect monads like IO are the way functional programmers interact with the real world. Yet, monadic effects in programming languages like Scala often perform poorly compared to their Haskell counterparts—as much as 10x slower in some benchmarks. In this presentation, John A. De Goes, author of the Scalaz 8 effect system, dredges up an old paper to cast new light on the question of how to model effects, and comes to the surprising conclusion that in Scala, monads may not be the fastest way to model purely functional effects. Join John as he shows a new model of effects that offers performance improvements without sacrificing the wonderful purity that functional programmers rely on to reason about their software.
PHP string function helps us to manipulate string in various ways. There are various types of string function available. Here we discuss some important functions and its use with examples.
Building confidence in concurrent code with a model checker: TLA+ for program...Scott Wlaschin
As developers, we have a number of well-known practices to ensure code quality, such as unit tests, code review and so on. But these practices often break down when we need to design concurrent systems. Often, there can be subtle and serious bugs that are not found with conventional practices.
But there’s another approach that you can use -- model-checking -- that can detect potential concurrency errors at design time, and so dramatically increase your confidence in your code. In this talk, I’ll demonstrate and demystify TLA+, a powerful design and model-checking system. We’ll see how it can check your concurrent designs for errors, saving you time up front and frustration later!
Domain Driven Design with the F# type System -- NDC London 2013Scott Wlaschin
(Video of these slides here http://fsharpforfunandprofit.com/ddd)
Statically typed functional programming languages like F# encourage a very different way of thinking about types. The type system is your friend, not an annoyance, and can be used in many ways that might not be familiar to OO programmers.
Types can be used to represent the domain in a fine-grained, self documenting way. And in many cases, types can even be used to encode business rules so that you literally cannot create incorrect code. You can then use the static type checking almost as an instant unit test — making sure that your code is correct at compile time.
In this talk, we'll look at some of the ways you can use types as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary.
Code, links to video, etc., at http://fsharpforfunandprofit.com/ddd
For more on DDD and F# see:
http://fsharpforfunandprofit.com/ddd/
http://tomasp.net/blog/type-first-development.aspx/
http://gorodinski.com/blog/2013/02/17/domain-driven-design-with-fsharp-and-eventstore/
Collections Framework is a unified architecture for managing collections, Main Parts of Collections Framework
1. Interfaces :- Core interfaces defining common functionality exhibited by collections
2. Implementations :- Concrete classes of the core interfaces providing data structures
3. Operations :- Methods that perform various operations on collections
Introduces the functional programming ideas of Functor, Apply, Applicative And Monad. Shows how to implement each in Scala with Scalaz and how to validate the implementation using property based test using specs2 and scalacheck.
(Video and code at https://fsharpforfunandprofit.com/pipeline/)
Passing data through a pipeline of transformations is an alternative approach to classic OOP. The LINQ methods in .NET are designed around this, but the pipeline approach can be used for so much more than manipulating collections.
In this talk, I'll look at pipeline-oriented programming and how it relates to functional programming, the open-closed principle, unit testing, the onion architecture, and more. I'll finish up by showing how you can build a complete web app using only this approach.
Video and related blog posts at fsharpforfunandprofit.com/ettt
Follow along as I ridiculously over-engineer a simple game to demonstrate how functional programming can be used to create a real-world "enterprise-ready" application.
Topics covered include: encoding business rules into types, data hiding with parametric polymorphism, using functions for capability-based security, exposing a REST API with HATEAOS, the functional approach to logging, actors, scalability and more.
(video and more at http://fsharpforfunandprofit.com/fppatterns)
In object-oriented development, we are all familiar with design patterns such as the Strategy pattern and Decorator pattern, and design principles such as SOLID. The functional programming community has design patterns and principles as well. This talk will provide an overview of some of these patterns (such as currying, monads), and present some demonstrations of FP design in practice. We'll also look at some of the ways you can use these patterns as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary.
(Video of these slides here http://fsharpforfunandprofit.com/rop)
(My response to "this is just Either" here: http://fsharpforfunandprofit.com/rop/#monads)
Many examples in functional programming assume that you are always on the "happy path". But to create a robust real world application you must deal with validation, logging, network and service errors, and other annoyances.
So, how do you handle all this in a clean functional way? This talk will provide a brief introduction to this topic, using a fun and easy-to-understand railway analogy.
The Functional Programmer's Toolkit (NDC London 2019)Scott Wlaschin
(slides and video at https://fsharpforfunandprofit.com/fptoolkit)
The functional programming community has a number of patterns with strange names such as monads, monoids, functors, and catamorphisms.
In this beginner-friendly talk, we'll demystify these techniques and see how they all fit together into a small but versatile "tool kit".
We'll then see how the tools in this tool kit can be applied to a wide variety of programming problems, such as handling missing data, working with lists, and implementing the functional equivalent of dependency injection.
Nat, List and Option Monoids -from scratch -Combining and Folding -an examplePhilip Schwarz
Nat, List and Option Monoids, from scratch. Combining and Folding: an example.
Code: https://github.com/philipschwarz/nat-list-and-option-monoids-from-scratch-combining-and-folding-an-example
(video of these slides available here http://fsharpforfunandprofit.com/fppatterns/)
In object-oriented development, we are all familiar with design patterns such as the Strategy pattern and Decorator pattern, and design principles such as SOLID.
The functional programming community has design patterns and principles as well.
This talk will provide an overview of some of these, and present some demonstrations of FP design in practice.
Blazing Fast, Pure Effects without Monads — LambdaConf 2018John De Goes
Effect monads like IO are the way functional programmers interact with the real world. Yet, monadic effects in programming languages like Scala often perform poorly compared to their Haskell counterparts—as much as 10x slower in some benchmarks. In this presentation, John A. De Goes, author of the Scalaz 8 effect system, dredges up an old paper to cast new light on the question of how to model effects, and comes to the surprising conclusion that in Scala, monads may not be the fastest way to model purely functional effects. Join John as he shows a new model of effects that offers performance improvements without sacrificing the wonderful purity that functional programmers rely on to reason about their software.
PHP string function helps us to manipulate string in various ways. There are various types of string function available. Here we discuss some important functions and its use with examples.
Building confidence in concurrent code with a model checker: TLA+ for program...Scott Wlaschin
As developers, we have a number of well-known practices to ensure code quality, such as unit tests, code review and so on. But these practices often break down when we need to design concurrent systems. Often, there can be subtle and serious bugs that are not found with conventional practices.
But there’s another approach that you can use -- model-checking -- that can detect potential concurrency errors at design time, and so dramatically increase your confidence in your code. In this talk, I’ll demonstrate and demystify TLA+, a powerful design and model-checking system. We’ll see how it can check your concurrent designs for errors, saving you time up front and frustration later!
Domain Driven Design with the F# type System -- NDC London 2013Scott Wlaschin
(Video of these slides here http://fsharpforfunandprofit.com/ddd)
Statically typed functional programming languages like F# encourage a very different way of thinking about types. The type system is your friend, not an annoyance, and can be used in many ways that might not be familiar to OO programmers.
Types can be used to represent the domain in a fine-grained, self documenting way. And in many cases, types can even be used to encode business rules so that you literally cannot create incorrect code. You can then use the static type checking almost as an instant unit test — making sure that your code is correct at compile time.
In this talk, we'll look at some of the ways you can use types as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary.
Code, links to video, etc., at http://fsharpforfunandprofit.com/ddd
For more on DDD and F# see:
http://fsharpforfunandprofit.com/ddd/
http://tomasp.net/blog/type-first-development.aspx/
http://gorodinski.com/blog/2013/02/17/domain-driven-design-with-fsharp-and-eventstore/
Collections Framework is a unified architecture for managing collections, Main Parts of Collections Framework
1. Interfaces :- Core interfaces defining common functionality exhibited by collections
2. Implementations :- Concrete classes of the core interfaces providing data structures
3. Operations :- Methods that perform various operations on collections
In this talk we explain the basics of Typed Actors as they are to land in Akka as a stable module in 2018. Typed Actors ("Akka Typed") re-introduce typesafety to concurrency and distributed systems thanks to the abstraction of a typed actor reference.
Pattern Matching: From Small Enhancement to Major Feature (talk from JavaLand...🎤 Hanno Embregts 🎸
At first it seemed to be just a small enhancement: the addition of “Pattern Matching for instanceof” (JEP 305) in Java 14. No more unnecessary casting after an instanceof, that ought to save us a few seconds a day! However, upon further investigation you’ll quickly discover that pattern matching is not just an enhancement, but rather a vital puzzle piece in the grander scheme of things.
Why were switch expressions added to Java, for example? To make them support pattern matching in a later release! And why did Java 14 bring us records and will Java 15 contain sealed types? Because they could work really well with pattern matching in a later release! These new concepts are the foundation upon which advanced pattern matching features will be built.
So attend this session to get all caught up! You’ll hear about type patterns, deconstruction patterns, nested patterns and even how pattern matching could improve serialization in the future. Live coding included, of course!
Some parts of our applications don't need to be asynchronous or interact with the outside world: it's enough that they are stateful, possibly with the ability to handle failure, context, and logging. Although you can use ZIO 2 or monad transformers for this task, both come with drawbacks. In this presentation, Jorge Vásquez will introduce you to ZPure, a data type from ZIO Prelude, which lets you scale back on the power of ZIO 2, but with the same high-performance, type-inference, and ergonomics you expect from ZIO 2 libraries.
You do not need automation engineer - Sqa Days - 2015 - ENIakiv Kramarenko
English Version of presentation for the "You don't need automation engineer" talk, given (in russian) at SQA Days 2015.
You can watch the "screencast" try-out cut at https://youtu.be/TZhbI-JPdG0
PL/SQL is Oracle Corporation's procedural extension for SQL and the Oracle relational database. PL/SQL is available in Oracle Database, Times Ten in-memory database, and IBM DB 2. Oracle Corporation usually extends PL/SQL functionality with each successive release of the Oracle Database.
Pattern Matching: Small Enhancement or Major Feature? (talk from jLove 2021)🎤 Hanno Embregts 🎸
At first it seemed to be just a small enhancement: the addition of “Pattern Matching for instanceof” (JEP 305) in Java 14. No more unnecessary casting after an instanceof, that ought to save us a few seconds a day! However, upon further investigation you’ll quickly discover that pattern matching is not just an enhancement, but rather a vital puzzle piece in the grander scheme of things.
Why were switch expressions added to Java, for example? To make them support pattern matching in a later release! And why did Java 14 bring us records and will Java 15 contain sealed types? Because they could work really well with pattern matching in a later release! These new concepts are the foundation upon which advanced pattern matching features will be built.
So attend this session to get all caught up! You’ll hear about type patterns, deconstruction patterns, nested patterns and even how pattern matching could improve serialization in the future. Live coding included, of course!
Similar to Thirteen ways of looking at a turtle (20)
Domain Modeling Made Functional (DevTernity 2022)Scott Wlaschin
(video at https://fsharpforfunandprofit.com/ddd/)
Statically typed functional programming languages encourage a very different way of thinking about types. The type system is your friend, not an annoyance, and can be used in many ways that might not be familiar to OO programmers. Types can be used to represent the domain in a fine-grained, self documenting way. And in many cases, types can even be used to encode business rules so that you literally cannot create incorrect code. You can then use the static type checking almost as an instant unit test — making sure that your code is correct at compile time. In this talk, we'll look at some of the ways you can use types as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary.
Functional programming can be an excellent approach to designing decoupled, reusable systems with a rich domain model. In fact, the lessons from applying DDD in a functional language translate well to object-oriented programming.
Reinventing the Transaction Script (NDC London 2020)Scott Wlaschin
The Transaction Script pattern organizes business logic as a single procedure. It has always been considered less sophisticated and flexible than a layered architecture with a rich domain model. But is that really true?
In this talk, we'll reinvent the Transaction Script using functional programming principles. We'll see that we can still do domain-driven design, and still have code which is decoupled and reusable, all while preserving the simplicity and productivity of the original one-script-per-workflow approach.
(Video available at https://fsharpforfunandprofit.com/composition/)
Composition is a fundamental building block of functional programming, but how is it different from an object-oriented approach, and how do you use it in practice?
In this talk for beginners, we'll start by going over the basic concepts of functional programming, and then look at some different ways that composition can be used to build large things from small things.
After that, we'll see how composition is used in practice, beginning with some basic examples, and ending with a complete (object-free!) web application.
Domain Modeling Made Functional (KanDDDinsky 2019)Scott Wlaschin
(video at https://fsharpforfunandprofit.com/ddd/)
Statically typed functional programming languages encourage a very different way of thinking about types. The type system is your friend, not an annoyance, and can be used in many ways that might not be familiar to OO programmers. Types can be used to represent the domain in a fine-grained, self documenting way. And in many cases, types can even be used to encode business rules so that you literally cannot create incorrect code. You can then use the static type checking almost as an instant unit test — making sure that your code is correct at compile time. In this talk, we'll look at some of the ways you can use types as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary.
Four Languages From Forty Years Ago (NewCrafts 2019)Scott Wlaschin
(More info and video at fsharpforfunandprofit.com/fourfromforty)
The 1970's were a golden age for new programming languages, but do they have any relevance to programming today? Can we still learn from them?
In this talk, we'll look at four languages designed over forty years ago -- SQL, Prolog, ML, and Smalltalk -- and discuss their philosophy and approach to programming, which is very different from most popular languages today.
We'll come away with some practical principles that are still very applicable to modern development. And you might discover your new favorite programming paradigm!
(More info and video at fsharpforfunandprofit.com/fourfromforty)
The 1970's were a golden age for new programming languages, but do they have any relevance to programming today? Can we still learn from them?
In this talk, we'll look at four languages designed over forty years ago -- SQL, Prolog, ML, and Smalltalk -- and discuss their philosophy and approach to programming, which is very different from most popular languages today.
We'll come away with some practical principles that are still very applicable to modern development. And you might discover your new favorite programming paradigm!
(Video and more at fsharpforfunandprofit.com/csharp)
Curious about F# and want to understand how is it different from C#?
In this talk, we'll look at the basics of coding in F#, and how functional programming differs from object-oriented programming. Along the way, there will be many examples showing the same code written in C# and F# so that you can see for yourself how the two languages differ in style and approach.
(Video and code available at http://fsharpforfunandprofit.com/cap)
In this talk I'll look at a unusual approach to designing internal interfaces and external APIs -- a "capability-based" approach that takes the Principle Of Least Authority and applies it to software design.
When this approach is used, it produces a robust and modular design which captures the domain constraints, resulting in an API which is self-documenting and hard to misuse.
I'll demonstrate how to design and implement a capability based approach, how capabilities can be quickly combined and restricted easily, and how capabilities are a natural fit with a REST API that uses HATEOAS.
(Demo code and video available at http://fsharpforfunandprofit.com/cap/)
We all want to produce modular and robust code that is easy to test and refactor, and we have design principles such as SOLID that help us do that.
In this talk I'll look at a very different approach to design using "capabilities" and the principle of least authority. I'll show how using these design techniques throughout your core domain (and not just at your API boundary) also leads to well-designed and modular code.
I'll demonstrate how to design and use a capability based approach, how capabilities can be quickly combined and restricted easily, and how capabilities are a natural fit with a REST API that uses HATEAOS.
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Scott Wlaschin
(Video of these slides here http://fsharpforfunandprofit.com/ddd)
Statically typed functional programming languages like F# encourage a very different way of thinking about types. The type system is your friend, not an annoyance, and can be used in many ways that might not be familiar to OO programmers.
Types can be used to represent the domain in a fine-grained, self documenting way. And in many cases, types can even be used to encode business rules so that you literally cannot create incorrect code. You can then use the static type checking almost as an instant unit test — making sure that your code is correct at compile time.
In this talk, we'll look at some of the ways you can use types as part of a domain driven design process, with some simple real world examples in F#. No jargon, no maths, and no prior F# experience necessary.
Code, links to video, etc., at http://fsharpforfunandprofit.com/ddd
NEW AND IMPROVED - added sections on:
* why OO, not FP is scary
* designing with states and transitions
First Steps with Globus Compute Multi-User EndpointsGlobus
In this presentation we will share our experiences around getting started with the Globus Compute multi-user endpoint. Working with the Pharmacology group at the University of Auckland, we have previously written an application using Globus Compute that can offload computationally expensive steps in the researcher's workflows, which they wish to manage from their familiar Windows environments, onto the NeSI (New Zealand eScience Infrastructure) cluster. Some of the challenges we have encountered were that each researcher had to set up and manage their own single-user globus compute endpoint and that the workloads had varying resource requirements (CPUs, memory and wall time) between different runs. We hope that the multi-user endpoint will help to address these challenges and share an update on our progress here.
May Marketo Masterclass, London MUG May 22 2024.pdfAdele Miller
Can't make Adobe Summit in Vegas? No sweat because the EMEA Marketo Engage Champions are coming to London to share their Summit sessions, insights and more!
This is a MUG with a twist you don't want to miss.
Software Engineering, Software Consulting, Tech Lead, Spring Boot, Spring Cloud, Spring Core, Spring JDBC, Spring Transaction, Spring MVC, OpenShift Cloud Platform, Kafka, REST, SOAP, LLD & HLD.
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxrickgrimesss22
Discover the essential features to incorporate in your Winzo clone app to boost business growth, enhance user engagement, and drive revenue. Learn how to create a compelling gaming experience that stands out in the competitive market.
Atelier - Innover avec l’IA Générative et les graphes de connaissancesNeo4j
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Allez au-delà du battage médiatique autour de l’IA et découvrez des techniques pratiques pour utiliser l’IA de manière responsable à travers les données de votre organisation. Explorez comment utiliser les graphes de connaissances pour augmenter la précision, la transparence et la capacité d’explication dans les systèmes d’IA générative. Vous partirez avec une expérience pratique combinant les relations entre les données et les LLM pour apporter du contexte spécifique à votre domaine et améliorer votre raisonnement.
Amenez votre ordinateur portable et nous vous guiderons sur la mise en place de votre propre pile d’IA générative, en vous fournissant des exemples pratiques et codés pour démarrer en quelques minutes.
OpenMetadata Community Meeting - 5th June 2024OpenMetadata
The OpenMetadata Community Meeting was held on June 5th, 2024. In this meeting, we discussed about the data quality capabilities that are integrated with the Incident Manager, providing a complete solution to handle your data observability needs. Watch the end-to-end demo of the data quality features.
* How to run your own data quality framework
* What is the performance impact of running data quality frameworks
* How to run the test cases in your own ETL pipelines
* How the Incident Manager is integrated
* Get notified with alerts when test cases fail
Watch the meeting recording here - https://www.youtube.com/watch?v=UbNOje0kf6E
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Globus
The Earth System Grid Federation (ESGF) is a global network of data servers that archives and distributes the planet’s largest collection of Earth system model output for thousands of climate and environmental scientists worldwide. Many of these petabyte-scale data archives are located in proximity to large high-performance computing (HPC) or cloud computing resources, but the primary workflow for data users consists of transferring data, and applying computations on a different system. As a part of the ESGF 2.0 US project (funded by the United States Department of Energy Office of Science), we developed pre-defined data workflows, which can be run on-demand, capable of applying many data reduction and data analysis to the large ESGF data archives, transferring only the resultant analysis (ex. visualizations, smaller data files). In this talk, we will showcase a few of these workflows, highlighting how Globus Flows can be used for petabyte-scale climate analysis.
Enhancing Research Orchestration Capabilities at ORNL.pdfGlobus
Cross-facility research orchestration comes with ever-changing constraints regarding the availability and suitability of various compute and data resources. In short, a flexible data and processing fabric is needed to enable the dynamic redirection of data and compute tasks throughout the lifecycle of an experiment. In this talk, we illustrate how we easily leveraged Globus services to instrument the ACE research testbed at the Oak Ridge Leadership Computing Facility with flexible data and task orchestration capabilities.
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...Juraj Vysvader
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I didn't get rich from it but it did have 63K downloads (powered possible tens of thousands of websites).
Utilocate offers a comprehensive solution for locate ticket management by automating and streamlining the entire process. By integrating with Geospatial Information Systems (GIS), it provides accurate mapping and visualization of utility locations, enhancing decision-making and reducing the risk of errors. The system's advanced data analytics tools help identify trends, predict potential issues, and optimize resource allocation, making the locate ticket management process smarter and more efficient. Additionally, automated ticket management ensures consistency and reduces human error, while real-time notifications keep all relevant personnel informed and ready to respond promptly.
The system's ability to streamline workflows and automate ticket routing significantly reduces the time taken to process each ticket, making the process faster and more efficient. Mobile access allows field technicians to update ticket information on the go, ensuring that the latest information is always available and accelerating the locate process. Overall, Utilocate not only enhances the efficiency and accuracy of locate ticket management but also improves safety by minimizing the risk of utility damage through precise and timely locates.
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Mind IT Systems
Healthcare providers often struggle with the complexities of chronic conditions and remote patient monitoring, as each patient requires personalized care and ongoing monitoring. Off-the-shelf solutions may not meet these diverse needs, leading to inefficiencies and gaps in care. It’s here, custom healthcare software offers a tailored solution, ensuring improved care and effectiveness.
Large Language Models and the End of ProgrammingMatt Welsh
Talk by Matt Welsh at Craft Conference 2024 on the impact that Large Language Models will have on the future of software development. In this talk, I discuss the ways in which LLMs will impact the software industry, from replacing human software developers with AI, to replacing conventional software with models that perform reasoning, computation, and problem-solving.
Zoom is a comprehensive platform designed to connect individuals and teams efficiently. With its user-friendly interface and powerful features, Zoom has become a go-to solution for virtual communication and collaboration. It offers a range of tools, including virtual meetings, team chat, VoIP phone systems, online whiteboards, and AI companions, to streamline workflows and enhance productivity.
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Crescat
Crescat is industry-trusted event management software, built by event professionals for event professionals. Founded in 2017, we have three key products tailored for the live event industry.
Crescat Event for concert promoters and event agencies. Crescat Venue for music venues, conference centers, wedding venues, concert halls and more. And Crescat Festival for festivals, conferences and complex events.
With a wide range of popular features such as event scheduling, shift management, volunteer and crew coordination, artist booking and much more, Crescat is designed for customisation and ease-of-use.
Over 125,000 events have been planned in Crescat and with hundreds of customers of all shapes and sizes, from boutique event agencies through to international concert promoters, Crescat is rigged for success. What's more, we highly value feedback from our users and we are constantly improving our software with updates, new features and improvements.
If you plan events, run a venue or produce festivals and you're looking for ways to make your life easier, then we have a solution for you. Try our software for free or schedule a no-obligation demo with one of our product specialists today at crescat.io
AI Genie Review: World’s First Open AI WordPress Website CreatorGoogle
AI Genie Review: World’s First Open AI WordPress Website Creator
👉👉 Click Here To Get More Info 👇👇
https://sumonreview.com/ai-genie-review
AI Genie Review: Key Features
✅Creates Limitless Real-Time Unique Content, auto-publishing Posts, Pages & Images directly from Chat GPT & Open AI on WordPress in any Niche
✅First & Only Google Bard Approved Software That Publishes 100% Original, SEO Friendly Content using Open AI
✅Publish Automated Posts and Pages using AI Genie directly on Your website
✅50 DFY Websites Included Without Adding Any Images, Content Or Doing Anything Yourself
✅Integrated Chat GPT Bot gives Instant Answers on Your Website to Visitors
✅Just Enter the title, and your Content for Pages and Posts will be ready on your website
✅Automatically insert visually appealing images into posts based on keywords and titles.
✅Choose the temperature of the content and control its randomness.
✅Control the length of the content to be generated.
✅Never Worry About Paying Huge Money Monthly To Top Content Creation Platforms
✅100% Easy-to-Use, Newbie-Friendly Technology
✅30-Days Money-Back Guarantee
See My Other Reviews Article:
(1) TubeTrivia AI Review: https://sumonreview.com/tubetrivia-ai-review
(2) SocioWave Review: https://sumonreview.com/sociowave-review
(3) AI Partner & Profit Review: https://sumonreview.com/ai-partner-profit-review
(4) AI Ebook Suite Review: https://sumonreview.com/ai-ebook-suite-review
#AIGenieApp #AIGenieBonus #AIGenieBonuses #AIGenieDemo #AIGenieDownload #AIGenieLegit #AIGenieLiveDemo #AIGenieOTO #AIGeniePreview #AIGenieReview #AIGenieReviewandBonus #AIGenieScamorLegit #AIGenieSoftware #AIGenieUpgrades #AIGenieUpsells #HowDoesAlGenie #HowtoBuyAIGenie #HowtoMakeMoneywithAIGenie #MakeMoneyOnline #MakeMoneywithAIGenie
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteGoogle
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
👉👉 Click Here To Get More Info 👇👇
https://sumonreview.com/ai-pilot-review/
AI Pilot Review: Key Features
✅Deploy AI expert bots in Any Niche With Just A Click
✅With one keyword, generate complete funnels, websites, landing pages, and more.
✅More than 85 AI features are included in the AI pilot.
✅No setup or configuration; use your voice (like Siri) to do whatever you want.
✅You Can Use AI Pilot To Create your version of AI Pilot And Charge People For It…
✅ZERO Manual Work With AI Pilot. Never write, Design, Or Code Again.
✅ZERO Limits On Features Or Usages
✅Use Our AI-powered Traffic To Get Hundreds Of Customers
✅No Complicated Setup: Get Up And Running In 2 Minutes
✅99.99% Up-Time Guaranteed
✅30 Days Money-Back Guarantee
✅ZERO Upfront Cost
See My Other Reviews Article:
(1) TubeTrivia AI Review: https://sumonreview.com/tubetrivia-ai-review
(2) SocioWave Review: https://sumonreview.com/sociowave-review
(3) AI Partner & Profit Review: https://sumonreview.com/ai-partner-profit-review
(4) AI Ebook Suite Review: https://sumonreview.com/ai-ebook-suite-review
7. Turtle API
API Description
Move aDistance Move some distance in the current
direction.
Turn anAngle Turn a certain number of degrees clockwise
or anticlockwise.
PenUp
PenDown
Put the pen down or up.
When the pen is down, moving the turtle
draws a line.
All of the following implementations will be
based on this interface or some variant of it.
10. type Turtle() =
let mutable currentPosition = initialPosition
let mutable currentAngle = 0.0<Degrees>
let mutable currentPenState = initialPenState
"mutable" keyword
needed in F#
Units of measure
used to document API
11. member this.Move(distance) =
Logger.info (sprintf "Move %0.1f" distance)
let startPos = currentPosition
// calculate new position
let endPos = calcNewPosition distance currentAngle startPos
// draw line if needed
if currentPenState = Down then
Canvas.draw startPos endPos
// update the state
currentPosition <- endPos
Assignment
12. member this.Turn(angleToTurn) =
Logger.info (sprintf "Turn %0.1f" angleToTurn)
// calculate new angle
let newAngle =
(currentAngle + angleToTurn) % 360.0<Degrees>
// update the state
currentAngle <- newAngle
13. member this.PenUp() =
Logger.info "Pen up"
currentPenState <- Up
member this.PenDown() =
Logger.info "Pen down"
currentPenState <- Down
14. Usage example
let drawTriangle() =
let distance = 50.0
let turtle =Turtle()
turtle.Move distance
turtle.Turn 120.0<Degrees>
turtle.Move distance
turtle.Turn 120.0<Degrees>
turtle.Move distance
turtle.Turn 120.0<Degrees>
// back home at (0,0) with angle 0
18. type TurtleState = private {
mutable position : Position
mutable angle : float<Degrees>
mutable penState : PenState
}
module Turtle =
let move distance state = ...
let turn angleToTurn state = ...
let penUp state = ...
let penDown log state =
Only turtle functions
can access it
State passed in
explicitly
Data
Behavior
19. Usage example
let drawTriangle() =
let distance = 50.0
let turtle = Turtle.create()
Turtle.move distance turtle
Turtle.turn 120.0<Degrees> turtle
Turtle.move distance turtle
Turtle.turn 120.0<Degrees> turtle
Turtle.move distance turtle
Turtle.turn 120.0<Degrees> turtle
State passed in
explicitly
20. Advantages and disadvantages
• Advantages
– Simple
– Forces composition over inheritance!
• Disadvantages
– As with OO: stateful, etc
23. type TurtleState = {
position : Position
angle : float<Degrees>
penState : PenState
}
module Turtle =
let move distance state = ... // return new state
let turn angleToTurn state = ... // return new state
let penUp state = ... // return new state
let penDown log state = // return new state
Public, immutable
State passed in
explicitly AND
returned
Data
Behavior
24. Usage example
let drawTriangle() =
let s0 =Turtle.initialTurtleState
let s1 =Turtle.move 50.0 s0
let s2 =Turtle.turn 120.0<Degrees> s1
let s3 =Turtle.move 50.0 s2
...
Passing state around is
annoying and ugly!
26. Usage example with pipes
let drawTriangle() =
Turtle.initialTurtleState
|>Turtle.move 50.0
|>Turtle.turn 120.0<Degrees>
|>Turtle.move 50.0
...
|> is pipe
operator
27. Advantages and disadvantages
• Advantages
– Immutability: Easy to reason about
– Stateless: Easy to test
– Functions are composable
• Disadvantages
– Client has to keep track of the state
– Hard-coded dependencies (for now)
35. Transforming the function #4
Wrap this in a type
called "State"
For more on how this works, see fsharpforfunandprofit.com/monadster
Input
Turtle
function
State< >
36. Usage example
let stateExpression = state { // "state" expression
let! distA = move 80.0
if distA < 80.0 then
printfn "first move failed -- turning"
do! turn 120.0<Degrees>
let! distB = move 80.0
...
else
printfn "first move succeeded"
let! distB = move 80.0
...
}
State is threaded
through behind the
scenes
Haskell has "do" notation. Scala has "for"comprehensions
37. Advantages and disadvantages
• Advantages
– Looks imperative, but preserves immutability.
– Functions still composable
• Disadvantages
– Harder to implement and use
39. How to return errors?
type Result<'successInfo,'errorInfo> =
| Success of 'successInfo
| Failure of 'errorInfo
TurtleState
Turtle
function
Success (new TurtleState)
Input Failure (error message)
Choice (aka Sum, aka Discriminated Union) type
40. let move distanceRequested state =
// calculate new position
// draw line if needed
if actualDistanceMoved <> distanceRequested then
Failure "Moved out of bounds"
else
Success {state with position = endPosition}
Two different choices for return value
(not easy in OO)
Implementation using Result
41. Usage example
let s0 = Turtle.initialTurtleState
let result1 = s0 |> Turtle.move 80.0
match result1 with
| Success s1 ->
let result2 = s1 |> Turtle.move 80.0
match result2 with
| Success s2 ->
printfn "second move succeeded"
...
| Failure msg ->
printfn "second move failed: %s" msg
...
| Failure msg ->
printfn "first move failed -- %s" msg
42. Usage example
let finalResult = result { // result expression
let s0 = Turtle.initialTurtleState
let! s1 = s0 |> Turtle.move 80.0
printfn "first move succeeded"
let! s2 = s1 |> Turtle.move 30.0
printfn "second move succeeded"
let! s3 = s2 |> Turtle.turn 120.0<Degrees>
let! s4 = s3 |> Turtle.move 80.0
printfn "third move succeeded"
return ()
}
Errors are managed
behind the scenes
Combine "state" and "result" for even prettier code
43. Usage example
let finalResult = resultState { // "result" and "state" combined
do! Turtle.move 80.0
printfn "first move succeeded"
do! Turtle.move 30.0
printfn "second move succeeded"
do! Turtle.turn 120.0<Degrees>
do! Turtle.move 80.0
printfn "third move succeeded"
return ()
}
Both errors and state
are now managed behind
the scenes
44. Advantages and disadvantages
• Advantages
– Errors are explicitly returned (no exceptions)
– Looks like "happy path" code
• Disadvantages
– Slightly harder to implement and use
For more, see fsharpforfunandprofit.com/rop
46. What if the Turtle calls were async?
let s0 = Turtle.initialTurtleState
s0 |> Turtle. moveAsync 80.0 (fun s1 ->
s1 |> Turtle.moveAsync 80.0 (fun s2 ->
s2 |> Turtle.moveAsync 80.0 (fun s3 ->
...
)
)
)
Callbacks
47. Async usage example
let finalResult = async { // "async" expression
let s0 =Turtle.initialTurtleState
let! s1 = s0 |> Turtle.moveAsync 80.0
let! s2 = s1 |> Turtle. moveAsync 80.0
let! s3 = s2 |> Turtle. moveAsync 80.0
...
}
Callbacks are managed
behind the scenes
48. Review: Common patterns
• Composition
– Chaining functions together
• Explicitness
– Explicit state management (no mutation)
– Explicit errors (no exceptions)
• Techniques to thread state/errors/callbacks
behind the scenes (the m-word)
51. Overview
Keep track of state here
Turtle
Functions
Batch
Runner
[command,
command,
command,
command]
Client
state
new state
Loop over
commands
run
52. How to convert a function into data?
// Turtle functions
let move distance = ...
let turn angle = ...
let penUp () = ...
let penDown () = ...
typeTurtleCommand =
| Move of Distance
|Turn of Angle
| PenUp
| PenDown
Choice type
53. Usage example
// create the list of commands
let commands = [
Move 100.0
Turn 120.0<Degrees>
Move 100.0
Turn 120.0<Degrees>
Move 100.0
Turn 120.0<Degrees>
]
// run them
TurtleBatch.run commands
This is *data* not function calls
54. "execute" implementation
/// Apply a command to the turtle state and return the new state
let executeCommand state command =
match command with
| Move distance ->
Turtle.move distance state
|Turn angleToTurn ->
Turtle.turn angleToTurn state
| PenUp ->
Turtle.penUp state
| PenDown ->
Turtle.penDown state
On-to-one correspondence
55. "run" implementation
/// Run list of commands in one go
let run aListOfCommands =
let mutable state = Turtle.initialTurtleState
for command in aListOfCommands do
state <- executeCommand state command
// return final state
state
56. "run" implementation
/// Run list of commands in one go
let run aListOfCommands =
aListOfCommands
|> List.fold executeCommand Turtle.initialTurtleState
Use built-in collection functions
where possible
57. Advantages and disadvantages
• Advantages
– Decoupled
– Simpler than monads!
• Disadvantages
– Batch oriented only
– No control flow inside batch
61. Pulling commands off a queue
let rec loop turtleState =
let command = // read a command from the message queue
let newState =
match command with
| Move distance ->
Turtle.move distance turtleState
// etc
loop newState
Recurse with new state
62. Usage example
// post a list of commands
let turtleActor = newTurtleActor()
turtleActor.Post (Move 100.0)
turtleActor.Post (Turn 120.0<Degrees>)
turtleActor.Post (Move 100.0)
turtleActor.Post (Turn 120.0<Degrees>)
Again, this is *data*
63. Advantages and disadvantages
• Advantages
– Decoupled
– Simpler than state monad
• Disadvantages
– Extra boilerplate needed
69. Command vs. Event
typeTurtleEvent =
| Moved of Distance * StartPosition * EndPosition
|Turned of AngleTurned * FinalAngle
| PenStateChanged of PenState
What *actually* happened
(past tense)
typeTurtleCommand =
| Move of Distance
|Turn of Angle
| PenUp
| PenDown
Compare with the command
70. Implementation
/// Apply an event to the current state and return the new state
let applyEvent state event =
match event with
| Moved (distance,startPosition,endPosition) ->
{state with position = endPosition } // don't callTurtle
|Turned (angleTurned,finalAngle) ->
{state with angle = finalAngle}
| PenStateChanged penState ->
{state with penState = penState}
Important!
No side effects when
recreating state!
71. Implementation
let handleCommand (command:TurtleCommand) =
// First load all the events from the event store
let eventHistory = EventStore.getEvents()
//Then, recreate the state before the command
let stateBeforeCommand =
eventHistory |> List.fold applyEvent Turtle.initialTurtleState
// Create new events from the command
let newEvents =
executeCommand command stateBeforeCommand
// Store the new events in the event store
events |> List.iter (EventStore.saveEvent)
This is where side-effects happen
No side effects
72. Advantages and disadvantages
• Advantages
– Decoupled
– Stateless
– Supports replay of events
• Disadvantages
– More complex
– Versioning
80. Advantages and disadvantages
• Advantages
– Same as Event Sourcing, plus
– Separates state logic from business logic
– Microservice friendly!
• Disadvantages
– Even more complex!
81. Review
• "Conscious decoupling" with data types
– Passing data instead of calling functions
• Immutable data stores
– Storing event history rather than current state
86. Advantages and disadvantages
• Advantages
– Well understood
• Disadvantages
– Unintentional dependencies
– Interfaces often not fine grained
– Often requires IoC container or similar
92. "move" implementation
let move logInfo draw distance state =
logInfo (sprintf "Move %0.1f" distance)
// calculate new position
...
// draw line if needed
if state.penState = Down then
draw startPosition endPosition
// update the state
...
Function
parameters
93. "turn" implementation
let turn logInfo angleToTurn state =
logInfo (sprintf "Turn %0.1f" angleToTurn)
// calculate new angle
let newAngle = ...
// update the state
...
Function
parameter
94. Turtle.initialTurtleState
|> move 50.0
|> turn 120.0<Degrees>
Partial application in practice
let move =Turtle.move Logger.info Canvas.draw
// output is new function: "move"
// (Distance -> TurtleState ->TurtleState)
let turn = Turtle.turn Logger.info
// output is new function: "turn"
// (float<Degrees> ->TurtleState ->TurtleState)
partial
application
Use new
functions here
96. Advantages and disadvantages
• Advantages
– Dependencies are explicit
– Functions, not interfaces
– Counterforce to having too many dependencies
(ISP for free!)
– Built in! No special libraries needed
• Disadvantages
– ??
98. APIs create coupling
module TurtleAPI =
move : Distance -> State -> Distance * State
turn : Angle -> State -> State
penUp : State -> State
penDown : State -> State
Fine, but what if the API
changes to return Result?
99. APIs create coupling
module TurtleAPI =
move : Distance -> State -> Result<Distance * State>
turn : Angle -> State -> Result<State>
penUp : State -> Result<State>
penDown : State -> Result<State>
Fine, but what if it needs to be
Async as well?
100. APIs create coupling
module TurtleAPI =
move : Distance -> State -> AsyncResult<Distance * State>
turn : Angle -> State -> AsyncResult<State>
penUp : State -> AsyncResult<State>
penDown : State -> AsyncResult<State>
Each change breaks the caller
Solution: decouple using data
instead of functions!
But how to manage control flow?
102. type TurtleProgram =
// (input params) (response)
| Move of Distance * (Distance -> TurtleProgram)
| Turn of Angle * (unit -> TurtleProgram)
| PenUp of (* none *) (unit -> TurtleProgram)
| PenDown of (* none *) (unit -> TurtleProgram)
| Stop
Create a "Program" type
Input Output from
interpreter
Next step for
the interpreter
New case
needed!
103. Usage example
let drawTriangle =
Move (100.0, fun actualDistA ->
// actualDistA is response from interpreter
Turn (120.0<Degrees>, fun () ->
// () is response from interpreter
Move (100.0, fun actualDistB ->
Turn (120.0<Degrees>, fun () ->
Move (100.0, fun actualDistC ->
Turn (120.0<Degrees>, fun () ->
Stop))))))
Ugly!
104. Usage example
let drawTriangle = turtleProgram { // Seen this trick before!
let! actualDistA = move 100.0
do! turn 120.0<Degrees>
let! actualDistB = move 100.0
do! turn 120.0<Degrees>
let! actualDistC = move 100.0
do! turn 120.0<Degrees>
}
106. Example:Turtle Interpreter
let rec interpretAsTurtle state program =
match program with
| Stop ->
state
| Move (dist, next) ->
let actualDistance, newState = Turtle.move dist state
let nextProgram = next actualDistance // next step
interpretAsTurtle newState nextProgram
|Turn (angle, next) ->
let newState = Turtle.turn angle state
let nextProgram = next() // next step
interpretAsTurtle newState nextProgram
Move the
turtle
Execute the
next step
107. Example: Distance Interpreter
let rec interpretAsDistance distanceSoFar program =
match program with
| Stop ->
distanceSoFar
| Move (dist, next) ->
let newDistance = distanceSoFar + dist
let nextProgram = next newDistance
interpretAsDistance newDistance nextProgram
|Turn (angle, next) ->
// no change in distanceSoFar
let nextProgram = next()
interpretAsDistance distanceSoFar nextProgram
Calculate the
new distance
Execute the
next step
109. Advantages and disadvantages
• Advantages
– Completely decoupled
– Pure API
– Optimization possible
• Disadvantages
– Complex
– Best with limited set of operations
Examples: Twitter's "Stitch" library, Facebook's "Haxl"
117. Turtle Capabilities
type TurtleCapabilities = {
move : MoveFn option
turn : TurnFn
penUp : PenUpDownFn
penDown: PenUpDownFn
}
and MoveFn = Distance -> TurtleCapabilities
and TurnFn = Angle -> TurtleCapabilities
and PenUpDownFn = unit -> TurtleCapabilities
118. Usage example
let turtleCaps = Turtle.start() // initial set of capabilities
match turtleCaps.move with
| None ->
warn "Error: Can't do move 1"
turtleCaps.turn 120<Degrees>
| Some moveFn -> // OK
let turtleCaps = moveFn 60.0 // a new set of capabilities
match turtleCaps.move with
| None ->
warn "Error: Can't do move 2"
turtleCaps.turn 120<Degrees>
| Some moveFn ->
...
120. Advantages and disadvantages
• Advantages
– Client doesn't need to duplicate business logic
– Better security
– Capabilities can be transformed for business rules
• Disadvantages
– Complex to implement
– Client has to handle unavailable functionality
Examples: HATEOAS
More at fsharpforfunandprofit.com/cap
121. Slides and video here
F# consulting
Phew!
fsharpforfunandprofit.com/turtle