Tango
  • Introduction
  • Getting Started
    • Summary
    • From me, the Developer
    • What is Tango?
    • Where to start?
  • Installation
    • Based on NuGet
    • Manually
  • Fundamentals
    • Introduction
    • Using Pattern Matching
    • Option values
    • Either values
    • From void to Unit
    • Func and Action
    • Chainable operations in a Continuation flow
    • Currying and Partial Application
  • Functional
    • Introduction
    • Currying
    • Partial Application
    • Functional Extensions
    • QuickCast to Delegates
  • Operations
    • Introduction
    • Operations with Booleans
    • Operations with Integers
    • Operations with Decimals
    • Operations with Doubles
    • Operations with Strings
  • Types
    • Introduction
    • Unit
    • Option<T>
    • Either<TLeft, TRight>
    • Continuation<TFail, TSuccess>
  • Modules
    • Introduction
    • Option
      • Apply
      • AsEnumerable
      • Bind
      • Count
      • Exists
      • Filter
      • Fold
      • FoldBack
      • Iterate
      • Map
      • OfNullable
      • ToArray
      • ToList
      • ToNullable
    • Either
      • Exists
      • Iterate
      • Fold
      • FoldBack
      • Map
      • Swap
      • ToTuple
    • Continuation
      • AsContinuation
      • Resolve
      • Reject
      • All
    • Collection
      • Append
      • Choose
      • ChunkBySize
      • Collect
      • CompareWith
      • CountBy
      • Concat
      • Distinct
      • Empty
      • Exists
      • Exists2
      • Filter
      • FindIndex
      • Fold
      • Fold2
      • FoldBack
      • FoldBack2
      • ForAll
      • ForAll2
      • ForAll3
      • Head
      • HeadAndTailEnd
      • Range
      • Generate
      • Initialize
      • Iterate
      • Iterate2
      • IterateIndexed
      • IterateIndexed2
      • Map
      • Map2
      • Map3
      • MapIndexed
      • MapIndexed2
      • MapIndexed3
      • Partition
      • Permute
      • Pick
      • Reduce
      • ReduceBack
      • Replicate
      • Scan
      • Scan2
      • ScanBack
      • ScanBack2
      • Tail
      • TryFind
      • TryPick
      • Unzip
      • Unzip3
      • Zip
      • Zip3
  • Extensions
    • Introduction
    • Enum Extensions
    • EqualityComparer Builder
    • Modules as Extensions
Powered by GitBook
On this page

Was this helpful?

  1. Fundamentals

Func and Action

A delegate is a reference type that is used to encapsulates an anonymous or named method.

This is the way of C# uses to allow the creation of high order functions and to turn possible treat methods as a first class member.

There's a lot of delegates embedded in C# language, but two of them are very important for functional development and for Tango.

They are: Func and Action delegates.

These two delegates can be used to represents any method presents in your code, with a single, but very important difference.

The Func delegate is only capable of encapsulate methods that creates a result, that is, all methods needs to return a new value.

While the Action delegate is capable of encapsulate methods that don't creates a result, that is, void methods.

There´s a lot of overloads of these two delegates in order to coverage any quantity of parameters, from 0 to 16.

For instance, see how Func delegates can be used to store a method:

Func<int,int,int> Add = (number1, number2) => number1 + number2;

Because of its overloads these delegates can be use to represents a lot of different methods.

In this next sample, an bool method will be encapsulated:

Func<int,bool> IsEven = number => number % 2 == 0;

Notice that the last type passed to generics in `Func 'delegate represents the type of value returned by the function, and the previous ones are used to represent the types of each parameter respectively.

The same occurs to the Action delegate, but at this time we have no return.

Action<double> WriteNumber = number => Console.WriteLine(number);

The System.Linq namespace, uses a lot of this concept to create powerful high order functions, like the Tango do. In order to create high order functions to improve your code, turning it more expressive and clean.

PreviousFrom void to UnitNextChainable operations in a Continuation flow

Last updated 5 years ago

Was this helpful?