Category Theory via C# (5) Bifunctor

[LINQ via C# series]

[Category Theory via C# series]


A functor is the mapping from 1 object to another object, with a “Select” ability to map 1 morphism to another morphism. A bifunctor (binary functor), as the name implies, is the mapping from 2 objects and from 2 morphisms. Giving category C, D and E, bifunctor F from category C, D to E is a structure-preserving morphism from C, D to E, denoted F: C × D → E:


  • F maps objects X ∈ ob(C), Y ∈ ob(D) to object F(X, Y) ∈ ob(E)
  • F also maps morphisms mC: X → X’ ∈ hom(C), mD: Y → Y’ ∈ hom(D) to morphism mE: F(X, Y) → F(X’, Y’) ∈ hom(E)

In DotNet category, bifunctors are binary endofunctors, and can be defined as:

// Cannot be compiled.
public interface IBifunctor<TBifunctor<,>> where TBifunctor<,> : IBifunctor<TBifunctor<,>>
    Func<TBifunctor<TSource1, TSource2>, TBifunctor<TResult1, TResult2>> Select<TSource1, TSource2, TResult1, TResult2>(
        Func<TSource1, TResult1> selector1, Func<TSource2, TResult2> selector2);

The most intuitive built-in bifunctor is ValueTuple<,>. Apparently ValueTuple<,> can be viewed as a type constructor of kind * –> * –> *, which accepts 2 concrete types to and return another concrete type. Its Select implementation is also straightforward:

public static partial class ValueTupleExtensions // ValueTuple<T1, T2> : IBifunctor<ValueTuple<,>>
    // Bifunctor Select: (TSource1 -> TResult1, TSource2 -> TResult2) -> (ValueTuple<TSource1, TSource2> -> ValueTuple<TResult1, TResult2>).
    public static Func<ValueTuple<TSource1, TSource2>, ValueTuple<TResult1, TResult2>> Select<TSource1, TSource2, TResult1, TResult2>(
        Func<TSource1, TResult1> selector1, Func<TSource2, TResult2> selector2) => source =>
            Select(source, selector1, selector2);

    // LINQ-like Select: (ValueTuple<TSource1, TSource2>, TSource1 -> TResult1, TSource2 -> TResult2) -> ValueTuple<TResult1, TResult2>).
    public static ValueTuple<TResult1, TResult2> Select<TSource1, TSource2, TResult1, TResult2>(
        this ValueTuple<TSource1, TSource2> source,
        Func<TSource1, TResult1> selector1,
        Func<TSource2, TResult2> selector2) =>
            (selector1(source.Item1), selector2(source.Item2));

However, similar to ValueTuple<> functor’s Select method, ValueTuple<,> bifunctor’s Select method has to call selector1 and selector2 immediately. To implement deferred execution, the following Lazy<,> bifunctor can be defined:

public class Lazy<T1, T2>
    private readonly Lazy<(T1, T2)> lazy;

    public Lazy(Func<(T1, T2)> factory) => this.lazy = new Lazy<(T1, T2)>(factory);

    public T1 Value1 => this.lazy.Value.Item1;

    public T2 Value2 => this.lazy.Value.Item2;

    public override string ToString() => this.lazy.Value.ToString();

Lazy<,> is simply the lazy version of ValueTuple<,>. Jut like Lazy<>, Lazy<,> can be constructed with a factory function, so that the call to selector1 and selector2 are deferred:

public static partial class LazyExtensions // Lazy<T1, T2> : IBifunctor<Lazy<,>>
    // Bifunctor Select: (TSource1 -> TResult1, TSource2 -> TResult2) -> (Lazy<TSource1, TSource2> -> Lazy<TResult1, TResult2>).
    public static Func<Lazy<TSource1, TSource2>, Lazy<TResult1, TResult2>> Select<TSource1, TSource2, TResult1, TResult2>(
        Func<TSource1, TResult1> selector1, Func<TSource2, TResult2> selector2) => source =>
            Select(source, selector1, selector2);

    // LINQ-like Select: (Lazy<TSource1, TSource2>, TSource1 -> TResult1, TSource2 -> TResult2) -> Lazy<TResult1, TResult2>).
    public static Lazy<TResult1, TResult2> Select<TSource1, TSource2, TResult1, TResult2>(
        this Lazy<TSource1, TSource2> source,
        Func<TSource1, TResult1> selector1,
        Func<TSource2, TResult2> selector2) =>
            new Lazy<TResult1, TResult2>(() => (selector1(source.Value1), selector2(source.Value2)));

Monoidal category

With the help of bifunctor, monoidal category can be defined. A monoidal category is a category C equipped with:

  • A bifunctor ⊗ as the monoid binary multiplication operation: bifunctor ⊗ maps 2 objects in C to another object in C, denoted C ⊗ C → C, which is also called the monoidal product or tensor product.
  • An unit object I ∈ ob(C) as the monoid unit, also called tensor unit

For (C, ⊗, I) to be a monoid, it also needs to be equipped with the following natural transformations, so that the monoid laws are satisfied:

  • Associator αX, Y, Z: (X ⊗ Y) ⊗ Z ⇒ X ⊗ (Y ⊗ Z) for the associativity law, where X, Y, Z ∈ ob(C)
  • Left unitor λX: I ⊗ X ⇒ X for the left unit law, and right unitor ρX: X ⊗ I ⇒ X for the right unit law, where X ∈ ob(C)

The following monoid triangle identity and pentagon identity diagrams still commute for monoidal category:



Here for monoidal category, the above ⊙ (general multiplication operator) becomes ⊗ (bifunctor).

Monoidal category can be simply defined as:

public interface IMonoidalCategory<TObject, TMorphism> : ICategory<TObject, TMorphism>, IMonoid<TObject> { }

DotNet category is monoidal category, with the most intuitive bifunctor ValueTuple<,> as the monoid multiplication, and Unit type as the monoid unit:

public partial class DotNetCategory : IMonoidalCategory<Type, Delegate>
    public Type Multiply(Type value1, Type value2) => typeof(ValueTuple<,>).MakeGenericType(value1, value2);

    public Type Unit() => typeof(Unit);

To have (DotNet, ValueTuple<,>, Unit) satisfy the monoid laws, the associator, left unitor and right unitor are easy to implement:

public partial class DotNetCategory
    // Associator: (T1 x T2) x T3 -> T1 x (T2 x T3)
    // Associator: ValueTuple<ValueTuple<T1, T2>, T3> -> ValueTuple<T1, ValueTuple<T2, T3>>
    public static (T1, (T2, T3)) Associator<T1, T2, T3>(((T1, T2), T3) product) =>
        (product.Item1.Item1, (product.Item1.Item2, product.Item2));

    // LeftUnitor: Unit x T -> T
    // LeftUnitor: ValueTuple<Unit, T> -> T
    public static T LeftUnitor<T>((Unit, T) product) => product.Item2;

    // RightUnitor: T x Unit -> T
    // RightUnitor: ValueTuple<T, Unit> -> T
    public static T RightUnitor<T>((T, Unit) product) => product.Item1;


  • - enter the 6 digit amazon mytv code you receive at screen at to regiter your device. contact amazon support for hel

  • I enjoyed your training

  • This article is really fantastic and thanks for sharing the valuable post.

  • awesome post. I’m a normal visitor of your web site and appreciate you taking the time to maintain the nice site. I’ll be a frequent visitor for a long time.

  • This post is really astounding one! I was delighted to read this, very much useful. Many thanks

  • Thanks for sharing.I found a lot of interesting information here. A really good post, very thankful and hopeful that you will write many more

  • Great Article it its really informative and innovative keep us posted with new updates. its was really valuable. 

  • Thanks for writing such a good article, I stumbled onto your blog and read a few post. I like your style of writing...

  • Great Post !! Very interesting topic will bookmark your site to check if you write more about in the future.

  • Very interesting topic will bookmark your site to check if you Post more about in the future.

  • بواسیر یا هموروئید به رگ های گشاد شده در راست روده گفته می شود که به کنترل مدفوع کمک می کند. آن ها در هنگام تورم یا التهاب بواسیر ایجاد می کنند.بواسیر داخلی و خارجی است. بواسیر داخلی در راست روده رشد می کند و بواسیر خارجی در خارج از مقعد به شکل توده ها و برآمدگی ها ایجاد می شود.درمان بواسیر خارجی شامل درمان های خانگی، جراحی و لیزر است. کلینیک لیزر شفا با مدیریت دکتر داود تاج بخش به عنوان بهترین مرکز درمان بیماری های گوارشی و نشیمن گاهی مجهز به تخصصی ترین و بروزترین دستگاه های لیزر ( که امروزه در دنیا استفاده میگردد) می باشد برای کسب اطلاعات بیشتر به وب سایت کلینیک لیزر شفا مراجعه فرمایید.

  • شرکت تهویه نوین ایرانیان با بهره گیری از کادری مجرب و حرفه ای، متشکل از مهندسین با تجربه و نیروهای متخصص بر آن است تا در مسیر تحقق مشتری مداری گامهایی مؤثرتر بردارد. در این راستا با ارائه محصولاتی با کیفیت، عملکردی مطلوب، هزینه ای بهینه و نیز خدمات پس از فروش، در پی جلب رضایت مشتریان گرامی است.

  • If you are looking to buy a Stoke laptop, you can visit our site.

  • I am very interested when reading your article. Oh yes, I also made an article, please visit.

  • Hey there! This is my first comment here so I just wanted to give a quick shout out and tell

  • I believe this web site has got some rattling good info for everyone.

  • It’s very simple to find out any matter on web as compared to textbooks, as I found this post at this site.

  • Nice to read this article.

  • Great post! I am actually getting ready to across this information, It's very helpful for this blog. Also great with all of the valuable information you have Keep up the good work you are doing well.

  • Studying the concepts of Java Programming Language is not easy for all students, it takes a lot of time to just understand the basics and with other tasks in hand, students fail to complete their assignments on time which affects their grades. Global Assignment Help provides the best Java Assignment Help to students who are facing the same problem.

  • Hi my name is James Henderson. I am an academic writer working with an esteemed organisation from past 3 years. I am providing dissertation help and coursework help. I will be happy to help you if you need assignment help.

  • The articles on your website are very useful. I greatly appreciate your work. Excellent.


  • ارتباط گیم تایم به شدولند
    از همان روز اولی که شدولند به دنیای world of warcraft آمد گیم تایم نیز ارائه شد. می توان گفت که اصلی ترین هدف ارتباط گیم تایم به شدولند جلوگیری از چیت زدن است. چرا که برای اینکه شما بتوانید گیم تایم را بازی کنید باید هزینه زیادی را پرداخت کنید. از طرفی دیگر قوی کردن سرور ها است. بعد از به وجود آمدن سرور های گیم تایم سرور های بازی خود وارکرافت نیز قوی تر شده است.

    سخن آخر خرید گیم تایم 60 روزه
    جمع بندی که می توان از این مطلب داشته باشیم این است که شما می توانید برای خرید گیم تایم 60 روزه از فروشگاه جت گیم آن را خریداری کنید. گیم تایم 60 روزه دارای سرور اروپا و آمریکا است که بهتر است سرور گیم تایم شما با شدولند شما یکی باشد تا از لحاظ پینگی مشکلی را به وجود نیاورد. امیدوارم مطالب برای علاقمندان این گیم جذاب مفید قرار گرفته باشه با تشکر.

  • به تازگی بازی Call of Duty: Vanguard که توسط استودیو Sledgehammer توسعه یافته است، با انتشار یک تریلر معرفی شد و همچنین در مراسم گیمزکام شاهد نشر یک کلیپ ویدیو ۱۰ دقیقه‌ای با محوریت قسمت داستانی آن بودیم. در این کلیپ ویدیو می‌توانیم آغاز روند داستان کاراکتر پالینا با بازی لارا بیلی را که براساس کاراکتری واقعی به نام لیودمیلا پاولیچنکو خلق شده به تماشا بنشینیم . این کلیپ ویدیو با به تصویر کشیدن قسمت آغازین روند داستانی این شخصیت ویژگی‌های جدید گان ‌پلی و بعضی محیط ‌های این بازی را نشان می‌دهد.

  • اگر قصد خرید لاک ژل (به صورت تک و عمده) را دارید، محصول مورد نظر خودتان را انتخاب کنید و پس از ثبت سفارش در سراسر ایران و درب منزل به صورت اکسپرس تحویل بگیرید.

  • برخی از بازی های  شرکت بلیزارد بصورت رایگان دردسترس گیمرها و کاربران نخواهد بود. و این کاربران برای استفاده از بازی  گیم تایم یا همان گیم کارت خریداری کنند. یکی از این بازی ها،‌ بازی محبوب و پرطرفدار ورلدآف وارکرافت است. به شارژ ماهیانه بازی وارکرافت در سرورهای بازی بلیزارد  گیم تایم می گویند ، که در فروشگاه جت گیم موجود می باشد.

    خرید گیم تایم 60 روزه ازفروشگاه جت گیم:

    در واقع گیم تایم 60 روزه نمونه ای جدید است از گیم تایم ها برای استفاده دربازی World of Warcraft  . که در ادامه بیشتر در مورد این محصول و نحوه استفاده از آن توضیح می دهیم .

    شما با خرید گیم تایم 60 روزه در مدت زمان آن گیم تایم ( 60 روز ) به امکاناتی در بازی World of Warcraft درسترسی پیدا خواهید کرد که این امکانات شامل موارد زیر میباشند :

    1 - اجازه لول آپ کردن تا لول 50 ( بدون گیم تایم فقط می توانید تا لول 20 بازی کنید )

    2 - اجازه  چت کردن با دیگران درون بازی ( بدون گیم تایم نمی توانید در بازی  چت کنید )

    3 - دسترسی به بازی World of Warcraft Classic

    در نتیجه برای بازی در World of Warcraft حتمآ به تهیه گیم تایم نیاز دارید.

    نکته 1 : گیم تایم یا همان زمان بازی ورد اف وارکرفت برای توانایی انلاین بازی کردن استفاده می شود و بدون گیم تایم امکان بازی کردن بازی محبوب ورد اف وارکرفت را نخواهید داشت.

    نکته 2 : درصورتی که گیم تایم نداشته باشید امکان بازی ورد اف وارکرفت کلاسیک را ندارید و شما میتوانید جهت خرید این محصول از وبسایت ما اقدام نمایید

    نکته 3 : نیازی به وارد کردن مشخصات اکانت بلیزارد شما نمی باشد زیرا کد گیم تایم  توسط خود شما و پس از دریافت کد، وارد می شود  ( آموزش وارد کردن در پایین صفحه قرار دارد )

  • Some Blizzard games will not be available to gamers and users for free. And these users to buy game time or the same game card. One of these games is محب the popular World of Warcraft game. The monthly charge of Warcraft game on Blizzard Game Time game servers, which is available in the Jet Game store.

    Buy 60-day game time from Jet Game store:

    In fact, 60-day game time is a new example of game time for use in World of Warcraft. In the following, we will explain more about this product and how to use it.

    By purchasing 60-day game time during that game time (60 days), you will get access to features in World of Warcraft, which include the following:

    1 - Allow to roll up to level 50 (without game time you can only play up to level 20)

    2 - Allow to chat with others in the game (without game time you can not chat in the game)

    3 - Access to the game World of Warcraft Classic

  • SIgning up for an account at is free and simple. You can create as many accounts as you want.

  • Minecraft games

  • لاکی پچر یک برنامه بسیار کاربردی برای اضافه کردن ویژگی های جدید به بازی ها و برنامه های اندروید می باشد. Lucky Patcher

  • When I read an article on this topic, Keonhacai the first thought was profound and difficult, and I wondered if others could understand.. My site has a discussion board for articles and photos similar to this topic. Could you please visit me when you have time to discuss this topic?

  • Your explanation is organized very easy to understand!!! I understood at once. Could you please post about Keo nha cai ?? Please!!

  • Watch cool xxx videos d va porn and incest anime sex videos at

  • I've been searching for hours on this topic and finally found your post. majorsite I have read your post and I am very impressed. We prefer your opinion and will visit this site frequently to refer to your opinion. When would you like to visit my site?

  • صفر تا صد صورت وضعیت نویسی تاسیسات برقی و مکانیکی ساختمان
    پروژه محور و صد در صد کاربردی
    سایت سودا

  • لوکزامبورگ که به خاطر سطح درآمد بالا و نرخ بیکاری پایین شناخته شده است، ثروتمندترین کشور جهان است. در حالی که نرخ تورم آن در آگوست 2022 به 6.8 درصد افزایش یافت، ثروت آن ثابت می ماند.

  • Looking at this article, I miss the time when I didn't wear a mask. baccaratcommunity Hopefully this corona will end soon. My blog is a blog that mainly posts pictures of daily life before Corona and landscapes at that time. If you want to remember that time again, please visit us.

  • Some subdivisions thus dissertation web site using the net literature need unsurprisingly explained in your web-site.

  • There are numerous dissertation websites on-line because you additionally obtain obviously stated inside your web site.

  • A heartfelt thank you is in order for this exceptionally insightful and entertaining article. Do keep us updated on what's happening. Very useful information was provided.

  • Nice site you got here, very awesome and good content.

  • I definitely love reading everything that is posted on your site.

  • Great site. A lot of helpful info here

  • Having read this I believed it was really enlightening. I appreciate you spending some time and energy to put this content together.

Add a Comment

As it will appear on the website

Not displayed

Your website