SlideShare a Scribd company logo
1 of 95
Download to read offline
1
Functional
programming f rom
its fundamentals
2
3
Beauvais Cathedral
Height of Ulm minister
161.5m
Height of Beauvais Cathedral
48m
4
Whoami I am
Software engineer at OpenValue
Co-organizer of FP Ams
Working at ING Bank
5
The goal of today
6
Content
Fundamentals of
functional
programming
LJ
Why do we need
functional
programming
Common constructs
from the
fundamentals
7
What is functional
programming
8
A function is a mapping between a domain
and a codomain. The only effect of a function
is computing the result
Programming
with
mathematical
functions
9
Properties of a
function
Totality
A function must yield a value
for every possible input
Purity
A function’s only effect must be
the computation of its return
value
Determinism
A function must yield the same
result for the same input
10
Expressions can be replaced with their values without changing the meaning of the program
Referential
transparency
Integer x = 1
new Pair<Integer, Integer>(x, x)
new Pair<Integer, Integer>(1, 1)
public Integer random() { … }
Integer x = random();
new Pair<Integer, Integer>(x, x)
public Integer random() { … }
new Pair<Integer, Integer>(random(), random())
13
Creates a new function from two other
functions where the second function will be
called with the result of evaluating the first
function
Function
composition
14
Function
composition
public static Integer length(String s) {
return s.length();
}
public static Integer plus2(Integer x) {
return x + 2;
}
public static Integer lengthPlus2(String s) {
return plus2(length(s));
}
15
Function
composition
public static <IN, MID, OUT> Function<IN, OUT> compose(Function<IN, MID> fst, Function<MID, OUT> snd) {
return (x -> snd.apply(fst.apply(x)));
}
16
Function
composition
Main.compose(Main::length, Main::plus2);
17
18
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(.) g f = a -> g (f a)
Function
composition
19
length :: String -> Int
plus2 :: Int -> Int
lengthPlus2 :: String -> Int -- lengthPlus2 "Hello Crowd!" -- 14
lengthPlus2 = plus2 . length
Function
composition
20
String -> Int
Int -> Int
Function
composition
21
Referential transparency
Function composition
Recap
ƽ
22
Why do we need
functional programming
23
Why do we need
functional
programming
Concurrency & Parallelism Easier to reason aboutReducing cognitive load
24
public class Class1 {
public String head(List<String> list) {
if (list.size() <= 0) {
return null;
}
return list.get(0);
}
}
Example 1
25
public class Class2 {
public Integer program(List<String> list) {
// can produce null pointer if list is empty
return head(list).length();
}
}
Example 1
26
public class Class1 {
public Optional<String> head(List<String> list) {
if (list.size() <= 0) {
return Optional.empty();
}
return Optional.of(list.get(0));
}
}
Example 2
27
public class Class2 {
public Optional<Integer> program(List<String> list) {
if (head(list).isPresent()) {
return Optional.of(head(list).get().length());
} else {
return Optional.empty();
}
}
}
Example 2
28
Common constructs f rom
the fundamentals
29
Translating a function that takes multiple
arguments into evaluating a sequence of
functions, each with a single argument.
Currying
30
(+) :: Int -> Int -> Int -- (+) 2 3 == 5
Currying
31
(+) :: Int -> (Int -> Int) -- (+) 2 3 == 5
Currying
32
doSomething :: String -> Int -> Double -> Int -> Int
-- doSomething “test” 1 1.0 5 == 9
Currying
33
doSomething :: String -> (Int -> (Double -> (Int -> Int)))
-- doSomething “test” 1 1.0 5 == 9
Currying
34
(+) :: Int -> (Int -> Int)
plus2 :: Int -> Int
plus2 = (+) 2 -- plus2 5 == 7
Currying
35
A tool to perform ad-hoc polymorphism in a
functional programming language
Type classes
36
public class Class1 {
public Optional<String> head(List<String> list) {
if (list.size() <= 0) {
return Optional.empty();
}
return Optional.of(list.get(0));
}
}
Polymorphism
in life
37
-- sortString [“ba”, “ab”, “cd”] == [“ab”, “ba”, “cd”]
sortString :: [String] -> [String]
sortString [] = []
sortString (p:xs) =
(sortString lesser) ++ [p] ++ (sortString greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
Code
duplication
38
-- sortInteger [1, 3, 2] == [1, 2, 3]
sortInteger :: [Integer] -> [Integer]
sortInteger [] = []
sortInteger (p:xs) =
(sortInteger lesser) ++ [p] ++ (sortInteger greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
Code
duplication
39
class Ord a where
(<) :: a -> a -> Bool
(<=) :: a -> a -> Bool
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
(>) :: a -> a -> Bool
(>=) :: a -> a -> Bool
Ord
typeclass
40
instance Ord Integer where
(<) a b = …
(<=) a b = …
(==) a b = …
(/=) a b = …
(>) a b = …
(>=) a b = …
Ord
instance for
Integer
41
Generalized
sort :: Ord a => [a] -> [a]
sort [] = []
sort (p:xs) = (sort lesser) ++ [p] ++ (sort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
42
Currying & Partial
application
Typeclasses
Recap
ƽ
43
Abstract over type constructors that can be
mapped over
Functor
44
repA :: Int -> List Char -- repA 3 == aaa
asciiNumber :: Char -> Int -- asciiNumber ‘a’ == 97
When
function
composition
doesn't f it
45
Int -> List Char
Char -> Int
When
function
composition
doesn't f it
46
Mapping
over the
value in a
context
fmap :: (a -> b) —> List a —> List b
47
Mapping
over the
value in a
context
repA :: Int -> List Char -- repA 3 == aaa
asciiNumber :: Char -> Int -- asciiNumber ‘a’ == 97
composed :: Int -> List Int -- composed 2 == [97, 97]
composed x = fmap asciiNumber (repA x)
fmap :: (a -> b)
—> List a —> List b
48
Lifting a
function in
a context
length :: String -> Int -- length “example” == 7
-- listLength [“example”, “test”] == [7, 4]
listLength :: List String -> List Int
listLength = fmap length
fmap :: (a -> b)
—> List a —> List b
49
Abstracting
over f map
-- fproduct [1, 2, 3] ((+) 1) == [(1,2), (2, 3), (3, 4)]
fproduct :: List a -> (a -> b) -> List (a, b)
fproduct list f = fmap (a -> (a, f a)) list
50
Abstracting
over f map
-- fproduct (Just 5) ((+) 1) == Just (5, 6)
fproduct :: Maybe a -> (a -> b) -> Maybe (a, b)
fproduct ma f = fmap (a -> (a, f a)) ma
51
Abstracting
over f map
fproduct :: IO a -> (a -> b) -> IO (a, b)
fproduct ma f = fmap (a -> (a, f a)) ma
52
Code
duplication
fproduct :: List a -> (a -> b) -> List (a, b)
fproduct ma f = fmap (a -> (a, f a)) ma
fproduct :: Maybe a -> (a -> b) -> Maybe (a, b)
fproduct ma f = fmap (a -> (a, f a)) ma
fproduct :: IO a -> (a -> b) -> IO (a, b)
fproduct ma f = fmap (a -> (a, f a)) ma
53
Functor
typeclass
class Functor f where
fmap :: (a -> b) -> f a -> f b
54
IO List Maybe
Functor
Hierarchy
55
Functor for
optionality
instance Functor Maybe where
fmap :: (a -> b) -> Maybe a -> Maybe b
fmap f (Just x) = Just $ f x
fmap f Nothing = Nothing
56
Functor for
List
instance Functor List where
fmap :: (a -> b) -> List a -> List b
fmap f [] = []
fmap f (x:xs) = f x : fmap f xs
57
Generalizing
f product
function
fproduct :: Functor f => f a -> (a -> b) -> f (a, b)
fproduct ma f = fmap (a -> (a, f a)) ma
58
Impossible
in Java
class Functor<F<>> {
}
59
Transforming values in
context
Functor typeclass allows
polymorphism
Recap
ƽ
60
Combine computations that depend on each
other
Monad
61
When
functor is
not enough
head :: List Int -> Maybe Int
head [] = Nothing
head (x:xs) = Just x
-- fiveDivBy 2 == Just 2.5
-- fiveDivBy 0 == Nothing
fiveDivBy :: Int -> Maybe Int
fiveDivBy 0 = Nothing
fiveDivBy x = Just (5 / x)
62
Map over f
with g
resulting in
context
List Int -> Maybe Int
Int -> Maybe Int
63
When
functor is
not enough
composed list = fmap fiveDivBy (head list)
64
When
functor is
not enough
composed :: List Int -> Maybe Maybe Int
composed list = fmap fiveDivBy (head list)
65
When
functor is
not enough
composed :: List Int -> Maybe Maybe Int
composed list = fmap fiveDivBy (head list)
-- composed [1, 2] == Just (Just 5)
-- composed [] == Nothing
-- composed [0, 3] == Just (Nothing)
66
When
functor is
not enough
composed :: List Int -> Maybe Int
composed list = flatten (fmap fiveDivBy (head list))
-- composed [1, 2] == Just 5
-- composed [] == Nothing
-- composed [0, 3] == Nothing
67
The Monad
typeclass
class Monad m where
return :: a -> m a
fmap :: (a -> b) -> m a -> m b
flatten :: m (m a) -> m a
68
The Monad
typeclass
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
69
The Monad
typeclass
class Monad m where
return :: a -> m a
fmap :: (a -> b) -> m a -> m b
flatten :: m (m a) -> m a
(>>=) :: m a -> (a -> m b) -> m b
(>>=) ma f = flatten (fmap f ma)
70
The Monad
typeclass
instance Monad Maybe where
return :: a -> Maybe a
return x = Just x
fmap :: (a -> b) -> Maybe a -> Maybe b
fmap f (Just x) = Just (f x)
fmap f Nothing = Nothing
flatten :: Maybe (Maybe a) -> Maybe a
flatten (Just (Just x)) = Just x
flatten _ = Nothing
71
Composing
with Monads
head :: List Int -> Maybe Int
head [] = Nothing
head (x: xs) = Just x
fiveDivBy :: Int -> Maybe Int
fiveDivBy 0 = Nothing
fiveDivBy x = Just (5 / x)
72
Composing
with Monads
List Int -> Maybe Int
Int -> Maybe Int
Head
fiveDivBy
73
Composing
with Monads
composed :: List Int -> Maybe Int
composed list = flatten (fmap fiveDivBy (head list))
74
Composing
with Monads
composed :: List Int -> Maybe Int
composed list = (head list) >>= fiveDivBy
-- composed [1, 2] == Just 5
-- composed [] == Nothing
-- composed [0, 3] == Nothing
75
Abstracting
function
composition
with effects
List Int -> Maybe Int
Int -> Maybe Int
Head
fiveDivBy
76
Abstracting
function
composition
with effects
a -> Maybe b
b -> Maybe c
f
g
77
Abstracting
function
composition
with effects
a -> List b
b -> List c
f
g
78
Abstracting
function
composition
with effects
a -> IO b
b -> IO c
f
g
79
Abstracting
function
composition
with effects
listComposition :: (a -> List b) -> (b -> List c) -> (a -> List c)
listComposition f g = a -> (f a) >>= g
80
Abstracting
function
composition
with effects
maybeComposition :: (a -> Maybe b) -> (b -> Maybe c) -> (a -> Maybe c)
maybeComposition f g = a -> (f a) >>= g
81
Abstracting
function
composition
with effects
ioComposition :: (a -> IO b) -> (b -> IO c) -> (a -> IO c)
ioComposition f g = a -> (f a) >>= g
82
listComposition :: (a -> List b) -> (b -> List c) -> (a -> List c)
listComposition f g = a -> (f a) >>= g
maybeComposition :: (a -> Maybe b) -> (b -> Maybe c) -> (a -> Maybe c)
maybeComposition f g = a -> (f a) >>= g
ioComposition :: (a -> IO b) -> (b -> IO c) -> (a -> IO c)
ioComposition f g = a -> (f a) >>= g
83
listComposition :: (a -> List b) -> (b -> List c) -> (a -> List c)
listComposition f g = a -> (f a) >>= g
maybeComposition :: (a -> Maybe b) -> (b -> Maybe c) -> (a -> Maybe c)
maybeComposition f g = a -> (f a) >>= g
ioComposition :: (a -> IO b) -> (b -> IO c) -> (a -> IO c)
ioComposition f g = a -> (f a) >>= g
84
listComposition :: (a -> m b) -> (b -> m c) -> (a -> m c)
listComposition f g = a -> (f a) >>= g
maybeComposition :: (a -> m b) -> (b -> m c) -> (a -> m c)
maybeComposition f g = a -> (f a) >>= g
ioComposition :: (a -> m b) -> (b -> m c) -> (a -> m c)
ioComposition f g = a -> (f a) >>= g
85
Kleisli
composition
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
(>=>) f g = a -> (f a) >>= g
86
Kleisli
examples
head :: [a] -> Maybe a
head [] = Nothing
head (x:xs) = Just x
fiveDivBy :: Double -> Maybe Double
fiveDivBy 0 = Nothing
fiveDivBy x = Just (5 / x)
87
Kleisli
examples
composed :: [Double] -> Maybe Double
composed = head >=> fiveDivBy
88
Kleisli
examples
composed :: [Double] -> Maybe Double
composed = head >=> fiveDivBy
-- composed [1.0, 2.0, 3.0] == Just 5.0
-- composed [0.0, 1.0, 2.0] == Nothing
-- composed [] == Nothing
89
Kleisli
examples
composed :: [Double] -> Maybe Double
composed list = case head list of
Just x -> fiveDivBy x
Nothing -> Nothing
90
Kleisli
examples
another :: Double -> Maybe String
91
Kleisli
examples
composed :: [Double] -> Maybe String
composed = head >=> fiveDivBy >=> another
92
Kleisli
examples
composed :: [Double] -> Maybe String
composed list = case head list of
Just x -> case fiveDivBy x of
Just y -> another y
Nothing -> Nothing
Nothing -> Nothing
93
Monad allows sequencing
of computations
Monad typeclass for
abstracting over monads
Recap
ƽKleisli composition as
function composition
with embellished types
94
Beauty of
functional
programming
Function composition doesn’t fit all requirements anymore
We start with function composition
Beautiful abstractions to fit the new requirements
95
Let’s connect
Twitter
@MauroPalsgraaf
LinkedIn
mauropalsgraaf

More Related Content

What's hot

関数潮流(Function Tendency)
関数潮流(Function Tendency)関数潮流(Function Tendency)
関数潮流(Function Tendency)
riue
 
Monads do not Compose
Monads do not ComposeMonads do not Compose
Monads do not Compose
Philip Schwarz
 

What's hot (14)

関数潮流(Function Tendency)
関数潮流(Function Tendency)関数潮流(Function Tendency)
関数潮流(Function Tendency)
 
Munihac 2018 - Beautiful Template Haskell
Munihac 2018 - Beautiful Template HaskellMunihac 2018 - Beautiful Template Haskell
Munihac 2018 - Beautiful Template Haskell
 
Excel function
Excel functionExcel function
Excel function
 
Closures
ClosuresClosures
Closures
 
Monads do not Compose
Monads do not ComposeMonads do not Compose
Monads do not Compose
 
Python programming : List and tuples
Python programming : List and tuplesPython programming : List and tuples
Python programming : List and tuples
 
Python3 cheatsheet
Python3 cheatsheetPython3 cheatsheet
Python3 cheatsheet
 
Running Free with the Monads
Running Free with the MonadsRunning Free with the Monads
Running Free with the Monads
 
Python programming : Standard Input and Output
Python programming : Standard Input and OutputPython programming : Standard Input and Output
Python programming : Standard Input and Output
 
Recursion part 2
Recursion part 2Recursion part 2
Recursion part 2
 
Functional programming with haskell
Functional programming with haskellFunctional programming with haskell
Functional programming with haskell
 
08. haskell Functions
08. haskell Functions08. haskell Functions
08. haskell Functions
 
Python programming -Tuple and Set Data type
Python programming -Tuple and Set Data typePython programming -Tuple and Set Data type
Python programming -Tuple and Set Data type
 
Fp in scala with adts part 2
Fp in scala with adts part 2Fp in scala with adts part 2
Fp in scala with adts part 2
 

Similar to Functional programming from its fundamentals

Functions in python
Functions in pythonFunctions in python
Functions in python
Ilian Iliev
 
Swift the implicit parts
Swift the implicit partsSwift the implicit parts
Swift the implicit parts
Maxim Zaks
 

Similar to Functional programming from its fundamentals (20)

Why Haskell Matters
Why Haskell MattersWhy Haskell Matters
Why Haskell Matters
 
TypeLevel Summit
TypeLevel SummitTypeLevel Summit
TypeLevel Summit
 
Humble introduction to category theory in haskell
Humble introduction to category theory in haskellHumble introduction to category theory in haskell
Humble introduction to category theory in haskell
 
Monadologie
MonadologieMonadologie
Monadologie
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python Programming
 
Chapter 02 functions -class xii
Chapter 02   functions -class xiiChapter 02   functions -class xii
Chapter 02 functions -class xii
 
Functors, applicatives, monads
Functors, applicatives, monadsFunctors, applicatives, monads
Functors, applicatives, monads
 
Functions in advanced programming
Functions in advanced programmingFunctions in advanced programming
Functions in advanced programming
 
Python programming workshop session 3
Python programming workshop session 3Python programming workshop session 3
Python programming workshop session 3
 
Functions in python
Functions in pythonFunctions in python
Functions in python
 
TDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação FuncionalTDC2016SP - Trilha Programação Funcional
TDC2016SP - Trilha Programação Funcional
 
Swift the implicit parts
Swift the implicit partsSwift the implicit parts
Swift the implicit parts
 
Fp java8
Fp java8Fp java8
Fp java8
 
Spark workshop
Spark workshopSpark workshop
Spark workshop
 
Numerical analysisgroup19
Numerical analysisgroup19Numerical analysisgroup19
Numerical analysisgroup19
 
Funkcija, objekt, python
Funkcija, objekt, pythonFunkcija, objekt, python
Funkcija, objekt, python
 
Scala by Luc Duponcheel
Scala by Luc DuponcheelScala by Luc Duponcheel
Scala by Luc Duponcheel
 
Functional Programming by Examples using Haskell
Functional Programming by Examples using HaskellFunctional Programming by Examples using Haskell
Functional Programming by Examples using Haskell
 
Practical cats
Practical catsPractical cats
Practical cats
 
Fp in scala part 2
Fp in scala part 2Fp in scala part 2
Fp in scala part 2
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Recently uploaded (20)

Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 

Functional programming from its fundamentals