Используя синтаксис LINQ-запросов с пользовательской реализацией Maybe monad

Я пытаюсь написать простой Может быть monad на C#. Я хочу иметь возможность использовать синтаксис LINQ-запросов с ним. Вот что я придумал до сих пор:

using System;
using System.Collections.Generic; 

abstract class Maybe<A> {
  public abstract Maybe<B> SelectMany<B>(Func<A, Maybe<B>> f);
  public abstract Maybe<B> Select<B>(Func<A, B> f);
}

class Just<A> : Maybe<A> {
  private readonly A a;

  public Just(A a) {
    this.a = a;
  }

  override public Maybe<B> SelectMany<B>(Func<A, Maybe<B>> f) {
    return f(a);
  }

  override public Maybe<B> Select<B>(Func<A, B> f) {
    return new Just<B>(f(a));
  }

  override public string ToString() {
    return "Just " + a;
  }
}

class Nothing<A> : Maybe<A> {
  override public Maybe<B> SelectMany<B>(Func<A, Maybe<B>> f) {
    return new Nothing<B>();
  }

  override public Maybe<B> Select<B>(Func<A, B> f) {
    return new Nothing<B>();
  }

  override public string ToString() {
    return "Nothing";
  }
}

static class Program {
  public static void Main(string[] args) {
    Maybe<int> m = new Just<int>(12);
    Maybe<int> n = new Nothing<int>();
    Maybe<int> result = from m0 in m
                        from n0 in n
                        select m0 + n0;
    Console.WriteLine(result);
  }
}

И это сообщение об ошибке:

prog.cs(48,25): error CS1501: No overload for method `SelectMany' takes `2' arguments
prog.cs(5,28): (Location of the symbol related to previous error)
Compilation failed: 1 error(s), 0 warnings

Кто-нибудь может подсказать мне, что я должен сделать, чтобы иметь возможность использовать синтаксис запросов с моей реализацией Maybe? Спасибо.

7
задан Mark Seemann 27 June 2017 в 08:44
поделиться