私はlanguage-extでFPを学んでいますが、克服できなかった問題に遭遇しました。コードを次の例に簡略化しました。
using System;
using System.Threading.Tasks;
using LanguageExt;
using static LanguageExt.Prelude;
using Xunit;
namespace Temp {
public class SelectManyError {
[Fact]
public async Task Do() {
var six = await from a in Task.FromResult(Right<Exception, int>(1))
from b in Task.FromResult(Right<Exception, int>(2))
from c in Task.FromResult(Right<Exception, int>(3))
select a + b + c;
}
}
}
このエラーが発生します:
ソースタイプに対してクエリパターンの複数の実装が見つかりました
Task<Either<Exception, int>>
。'SelectMany'へのあいまいな呼び出し。
このWebページを読むことで、コンパイラが問題を認識していることを理解しています。しかし、このシナリオがこのエラーの原因である理由や、それをどうするかがわからないため、私は明らかに何か重要なことを見逃しているか、理解していません。これは、句から2つしかない場合は問題なく機能し、さらに混乱します。
これは、このタイプの問題に対する間違ったアプローチですか?私が気付いていない別の方法はありますか?
コンパイラは、2行目で使用されていないため、タイプが何であるa
か(int
またはのいずれかEither<Exception, int>
)を理解するのに苦労していfrom
ます。
これは、この特定のケースに対するひどく醜い回避策です。ただし、どのタイプでも、ハックはそのタイプで機能するように適合させることができると思います。
using System;
using System.Threading.Tasks;
using LanguageExt;
using Xunit;
using static LanguageExt.Prelude;
public class Namespace
{
[Fact]
public async Task Method()
{
var six = await from a in Right<Exception, int>(1).AsTask()
from b in Right<Exception, int>(a - a + 2).AsTask()
from c in Right<Exception, int>(3).AsTask()
select a + b + c;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加