Este documento apresenta uma palestra sobre programação funcional em F#. Apresenta conceitos como composição, imutabilidade, funções de alta ordem, monads e como o LINQ pode ser entendido como uma aplicação desses conceitos funcionais. O palestrante é Rodrigo Vidal, especialista em F# e computação científica.
11. Aplicação Parcial
• Aplicação parcial envolve passar menos
argumentos para uma função que recebe
múltiplos argumentos
add :: Int -> Int -> Int
add x y = x + y
addOne = add 1
12. Currying
Currying é o processo de transformar uma função
que recebe multiplos argumentos para uma função
que recebe somente um argumento e retorna uma
outra função se algum paramêtro ainda for
necessário.
f :: a -> b -> c
É a forma ”curried” de
g :: (a, b) -> c
13. Funções de Alta Ordem
• Filter • First
• Map • Last
• Length • Zip
• All • Take
• Any • TakeWhile
• Max
• Min
25. Functors
class Functor f where
fmap :: (a -> b) -> f a -> f b
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap f (Nothing ) = Nothing
fmap (*2) [1..3]
> [2,4,6]
fmap (*2) Just 5
> Just 10
26. Funções como Functors
fmap :: (a -> b) -> ((->) r a) -> ((->) r b)
fmap :: (a -> b) -> (r -> a) -> (r -> b)
27. Applicative Functors
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
let a = fmap (*) [1,2,3,4]
a :: [Integer -> Integer]
28. Maybe Applicative Functor
instance Applicative Maybe Where
pure = Just
Nothing <*> _ = Nothing
(Just f) <*> something = fmap f something
pure (+) <*> Just 3 <*> Just 5
> Just 8
29. Monoids
class Monoid m where
mempty :: m
mappend :: m -> m -> m
mconcat :: [m] -> m
mconcat = foldr mappend mempty
31. instance Monoid Any where
mempty = Any False
Any x `mappend` Any y = Any (x || y)
getAny $ Any True `mappend` Any False
> True
getAny $ Any True `mappend` mempty
> True
32. instance Monoid All where
mempty = All True
All x `mappend` All y = All (x && y)
getAll $ mempty `mappend` All True
> True
getAll $ mempty `mappend` All False
> True
41. Notas Finais
• Aprenda Matemática
• Aprenda Algoritmos
• Aprenda uma Linguagem Funcional (F# :P)
• .NET Architects Rio de Janeiro
• DojoRio
• Hora Extra
• @rodrigovidal
• rodrigovidal777@gmail.com
• www.rodrigovidal.net