Funcky 2.4.0
See the version list below for details.
dotnet add package Funcky --version 2.4.0
NuGet\Install-Package Funcky -Version 2.4.0
<PackageReference Include="Funcky" Version="2.4.0" />
paket add Funcky --version 2.4.0
#r "nuget: Funcky, 2.4.0"
// Install Funcky as a Cake Addin #addin nuget:?package=Funcky&version=2.4.0 // Install Funcky as a Cake Tool #tool nuget:?package=Funcky&version=2.4.0
Funcky is a functional library for C# which encourages correct usage of the functional programming paradigm.
Packages
Funcky
Funcky.XUnit
Funcky.EntityFrameworkCore
Provides interoperability between Funcky and EF Core
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
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 RecordType. Use Fody or wait for C# 9
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.
Galaxus.Functional
This is a very simple Functional Library with similar ideas in spirit but not as mature.
And more…
Features
See our documentation (still in progress)
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 Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 is compatible. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETCoreApp 3.1
- No dependencies.
-
.NETStandard 2.0
- Microsoft.Bcl.AsyncInterfaces (>= 1.1.1 && < 2.0.0)
- Microsoft.Bcl.HashCode (>= 1.1.1 && < 6.0.0)
- System.Collections.Immutable (>= 1.7.1 && < 6.0.0)
- System.Text.Json (>= 4.7.2 && < 6.0.0)
-
.NETStandard 2.1
- System.Collections.Immutable (>= 1.7.1 && < 6.0.0)
- System.Text.Json (>= 4.7.2 && < 6.0.0)
-
net5.0
- No dependencies.
NuGet packages (14)
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. |
|
Messerli.FileSystem
File system abstraction that allows mocking file system actions |
|
Funcky.Xunit
Package to use Funcky with xUnit |
|
Messerli.ChangeCase
Transform a string between different casings. |
|
apophis.Lexer
The lexer was exactracted from the simple arithmetic parser. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
3.4.0 | 576 | 4/30/2024 |
3.3.0 | 2,686 | 7/14/2023 |
3.2.0 | 2,114 | 5/17/2023 |
3.1.0 | 1,942 | 11/16/2022 |
3.0.0 | 6,268 | 9/14/2022 |
2.7.1 | 695 | 6/13/2022 |
2.7.0 | 3,206 | 4/20/2022 |
2.6.0 | 964 | 12/16/2021 |
2.5.0 | 1,786 | 6/29/2021 |
2.4.1 | 512 | 5/21/2021 |
2.4.0 | 1,982 | 2/25/2021 |
2.3.0 | 1,089 | 11/27/2020 |
2.3.0-beta.1 | 246 | 10/22/2020 |
2.2.0 | 2,104 | 8/24/2020 |
2.1.1 | 747 | 8/14/2020 |
2.0.0 | 2,065 | 7/14/2020 |
2.0.0-rc.2 | 290 | 6/22/2020 |
2.0.0-rc.1 | 267 | 6/15/2020 |
1.8.1 | 565 | 6/10/2020 |
1.8.0 | 506 | 6/10/2020 |
1.7.0 | 570 | 6/8/2020 |
1.6.0 | 516 | 5/26/2020 |
1.5.1 | 1,721 | 2/21/2020 |
1.5.0 | 570 | 2/12/2020 |
1.4.0 | 529 | 2/7/2020 |
1.3.0 | 756 | 10/24/2019 |
1.2.0 | 837 | 7/22/2019 |
1.1.0 | 1,811 | 4/4/2019 |
1.0.2 | 1,208 | 3/12/2019 |
1.0.1 | 626 | 3/11/2019 |
1.0.0 | 701 | 3/10/2019 |