19. Композиция : функции
let read (x : string) : int = int(x)
let mult (x : int) : int = x * x
let write (x : int) : string = string(x)
19
20. Композиция : функции
let readMultWrite1 x =
write (mult (read x))
// x : string -> string
let readMultWrite2 =
read >> mult >> write
// string -> string
let readMultWrite3 x =
x |> read |> mult |> write
// x : string -> string
20
38. DI
public class BasketCostTranslator : IBasketCostTranslator
{
private readonly IExchangeRateProvider _provider;
public BasketCostTranslator(IExchangeRateProvider p)
{
// =)
}
public BasketCost TranslateCost(BasketCost cost)
{
// =)
}
}
38
39. DI
#кариррованиекакdi
type ICostTranslator = BasketCost -> BasketCost
let costTranslator exchangeProvider basket =
// =)
let translator = costTranslator exchangeRateProvider
39
40. Шаблонный метод
public class SimpleDeliveryCalculator : IDeliveryCostCalculator
{
public DeliveryOffer Calculate(
IEnumerable<PurchaseDimensions> purchases)
{
// do something
var packagesCount = CalculatePackagesCount(purchases);
// do something
}
protected virtual int CalculatePackagesCount(
IEnumerable<PurchaseDimensions> purchases)
{
// calculation
}
}
40
41. Шаблонный метод
public class ComplexDeliveryCalculator: SimpleDeliveryCalculator
{
protected override int CalculatePackagesCount(
IEnumerable<PurchaseDimensions> purchases)
{
// "complex" calculation
}
}
41
42. Шаблонный метод
#композициярулит
let deliveryCalculator packagesCalculator purchases =
// do something
let packagesCount = packagesCalculator purchases
// do something
let simpleCalculatePackages purchases =
// do something
let complexCalculatePackages purchases =
//do something
let calculator1 = deliveryCalculator simpleCalculatePackages
let calculator2 = deliveryCalculator complexCalculatePackages
42
43. Декоратор
public class LoggingDecorator : IExchangeRateProvider
{
private IExchangeRateProvider _service;
public LoggingDecorator(IExchangeRateProvider service)
{ ... }
public ExchangeRate GetRate(Currency currency) {
// log something
var result = _service.GetRate(currency);
// log something
return result;
}
}
43
49. Мемоизация
#ультракеширование
let memoize (f: 'a -> 'b) =
let dict = new Dictionary<'a, 'b>()
let memoized (input: 'a) =
match dict.TryGetValue(input) with
| true, x -> x
| false, _ ->
let result = f input
dict.Add(input, result)
result
memoized
let memAdder = memoize adder
49
50. Мемоизация
#ультракеширование
let memoize (f: 'a -> 'b) =
let dict = new Dictionary<'a, 'b>()
let memoized (input: 'a) =
match dict.TryGetValue(input) with
| true, x -> x
| false, _ ->
let result = f input
dict.Add(input, result)
result
memoized
let memAdder = memoize adder
50
51. Мемоизация
#ультракеширование
let memoize (f: 'a -> 'b) =
let dict = new Dictionary<'a, 'b>()
let memoized (input: 'a) =
match dict.TryGetValue(input) with
| true, x -> x
| false, _ ->
let result = f input
dict.Add(input, result)
result
memoized
let memAdder = memoize adder
51
59. Обработка ошибок
let handleRequest s =
match readRequest s with
| Success r ->
match readEntityFromDB r with
| Success e ->
match modifyEntity e with
| Success me ->
match createTaskFromEntity me with
| Success t ->
match writeTaskToMQ t with
| Success ts ->
createResultMessage ts
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error 59
63. Обработка ошибок
let handleRequest s =
match readRequest s with
| Success r ->
match readEntityFromDB r with
| Success e ->
match modifyEntity e with
| Success me ->
match createTaskFromEntity me with
| Success t ->
match writeTaskToMQ t with
| Success ts ->
createResultMessage ts
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error 63
64. Обработка ошибок
#паттернобнаружен
let handleRequest s =
match readRequest s with
| Success r ->
match readEntityFromDB r with
| Success e ->
match modifyEntity e with
| Success me ->
match createTaskFromEntity me with
| Success t ->
match writeTaskToMQ t with
| Success ts ->
createResultMessage ts
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error
| Error -> Error 64
68. Сухой итог
●
Функциональное программирование это просто
●
Можно использовать привычные приемы, но
проще
●
Можно заимствовать из функционального
программирования хитрые приемы
●
Монады совсем не страшные
68