Funcky 2.7.0

.NET 5.0 .NET Core 3.1 .NET Standard 2.0
Install-Package Funcky -Version 2.7.0
dotnet add package Funcky --version 2.7.0
<PackageReference Include="Funcky" Version="2.7.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Funcky --version 2.7.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Funcky, 2.7.0"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install Funcky as a Cake Addin
#addin nuget:?package=Funcky&version=2.7.0

// Install Funcky as a Cake Tool
#tool nuget:?package=Funcky&version=2.7.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

Funcky

Funcky is a functional library for C# which encourages correct usage of the functional programming paradigm.

Build Licence: MIT Licence: Apache

Packages

  • Funcky
    NuGet package
  • Funcky.XUnit
    NuGet package
  • Funcky.Analyzers: Analyzers to guide to the correct usage of Funcky.
    NuGet package
  • Funcky.EntityFrameworkCore: Provides interoperability between Funcky and EF Core
    NuGet package git: polyadic/funcky-efcore
  • Funcky.DiscriminatedUnion: Provides source generator for discriminated union support in C#
    NuGet package git: polyadic/funcky-discriminated-union

Features

See our in progress documentation for more examples.

Option Monad

The Option monad is the centerpiece of Funcky. It provides a safe and easy structure for working with optional values.
It follows naming already established by LINQ (Select, SelectMany, Where).

Option<string> input = ...;

var result = input
    .SelectMany(v => v.ParseIntOrNone())
    .Where(n => n >= 0)
    .Select(n => $"Non-Zero: {n}");

result.AndThen(Console.WriteLine);

IEnumerable Extensions

Funcky provides a plethora of extensions for IEnumerable that help with writing code using Functional programming paradigms.

Sequence.Return(1, 2, 3, 4)
    .Pairwise((left, right) => left + right) // [3, 5, 7]
    .Intersperse(-1) // [3, -1, 5, -1, 7]
    .Inspect(item => Console.WriteLine(item))
    .SlidingWindow(3) // [[3, -1, 5], [-1, 5, -1], [5, -1, 7]]
    .WhereSelect(window => window.AverageOrNone()) // [2, 1, 3]
    .JoinToString(", "); // "2, 1, 3"

… and more

  • Extensions that provide interoperability with Option for IQueryable, IAsyncEnumerable, string.
  • Fundamental functions: Identity, True, False, etc.
  • «Constructors» for IEnumerable: Sequence.Return, Sequence.Successors, etc.
  • Unit type
  • Result monad
  • Reader monad
  • Either monad

Motivation

Functional programming is the oldest of the three major programming paradigms, none the less it is the last which gets wide spread usage. Even in languages like C++, Java or C# we want to use a functional style of programming.

Linq is the first Monad which got wide spread use in C#, and most C# programmers were not even aware of it beeing a monad, which probably helped.

Mark Seemann points out that "Unfortunately, Maybe implementations often come with an API that enables you to ask a Maybe object if it's populated or empty, and a way to extract the value from the Maybe container. This misleads many programmers [...]"

https://blog.ploeh.dk/2019/02/04/how-to-get-the-value-out-of-the-monad/

This library is based on his example code, and should grow slowly to a library which helps to use and understand the Functional programming paradigm. Functional programming is side-effect free and the strong type system can be used to make illegal state impossible.

Use functional programming as an additional asset to write correct code.

Documentation

Documentation: in progress

Other libraries

There are several libraries available which try to give you more functional features in C#. So

  • Funcky wants to be functional C#.
  • Funcky tries to use the C# monadic interfaces as an advantage
  • We do not provide our own record type. Use the new record types in C# 9 or a weaver like Equals.Fody.

LanguageExt

This library is probably the most complete attempt to functional programming in C#, however it is very opinionated and admits to be not very idiomatic in C#. It certainly is more mature than Funcky and has a lot of features. If you want to go fully functional and for some reason cannot use F# this might be the way to go.

Eff

Eff is inspired by the Eff programming language and the implementation of Algebraic Effects. It's only purpose is the handling of side effects and using the await syntax in a very elegant way.

We think the approach is very nice but cumbersome in usage, however we really love the appraoch with the await syntax. The library is very specialised an can be used in combination with any other functional style library.

MoreLinq

MoreLinq provides more extension functions on IEnumerable, but has no additional functional concepts. We also provide additional extension functions on IEnumerable, but we also try to make them work in combination with our Monads and the async Monad. The different Monad-Syntaxes in C# (Linq, async) do not play niceley together.

… and more

Contributing

Contributions are more than welcome. Just open a PR 😃 If you want something easy to work on, there are a few issues marked with good first issue.

Documentation

To build the documentation you need mdBook installed. When working on the documentation it's useful to have mdbook watching and automatically rebuilding on changes:

mdbook serve Documentation

Dependency Policy

The core Funcky package is not allowed to have dependencies. Backwards compatibility packages from Microsoft that are included in newer framework versions (e.g. Microsoft.Bcl.AsyncInterfaces, System.Collections.Immutable) are exempt from this rule.

Interoperability with other libraries should be provided in separate packages (e.g. Funcky.Xunit, Funcky.NewtonsoftJson)

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (10)

Showing the top 5 NuGet packages that depend on Funcky:

Package Downloads
Messerli.LinqToRest

A LINQ QueryProvider that uses a REST API as its data source.

apophis.Lexer

The lexer was exactracted from the simple arithmetic parser.

Messerli.FileSystem

File system abstraction that allows mocking file system actions

Funcky.Xunit

Package to use Funcky with xUnit

SimpleArithmeticParser

Very Simple Proof of Concept Parser for Simple Arithmetic Expressions which supports Addition, Subtraction, Multiplication, Division, Function Calls and Variables

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2.7.0 214 4/20/2022
2.6.0 310 12/16/2021
2.5.0 473 6/29/2021
2.4.1 282 5/21/2021
2.4.0 709 2/25/2021
2.3.0 597 11/27/2020
2.3.0-beta.1 170 10/22/2020
2.2.0 1,168 8/24/2020
2.1.1 408 8/14/2020
2.0.0 957 7/14/2020
2.0.0-rc.2 209 6/22/2020
2.0.0-rc.1 184 6/15/2020
1.8.1 299 6/10/2020
1.8.0 280 6/10/2020
1.7.0 327 6/8/2020
1.6.0 290 5/26/2020
1.5.1 1,021 2/21/2020
1.5.0 332 2/12/2020
1.4.0 304 2/7/2020
1.3.0 431 10/24/2019
1.2.0 600 7/22/2019
1.1.0 873 4/4/2019
1.0.2 687 3/12/2019
1.0.1 400 3/11/2019
1.0.0 397 3/10/2019