У меня есть вычислительное выражение, которое я хочу вернуть в виде уплощенного кортежа в качестве первого элемента и int
в качестве второго. Я пытаюсь использовать для этого перегрузку метода. Прямо сейчас компилятор выдает ошибку, говоря, что он не может найти уникальную перегрузку. Не знаю, как помочь компилятору разобраться. Мне это кажется детерминированным.
type IntBuilder () =
member inline this.Yield (i:int) =
i
member inline this.For(source:seq<'a>, body:'a -> seq<'b * int>) =
source
|> Seq.collect (fun x -> body x |> Seq.map (fun (idx, i) -> (x, idx), i))
member inline this.For(source:seq<'a>, body:'a -> int) =
source |> Seq.map (fun x -> x, body x)
member inline this.Run(source:seq<('a * ('b * ('c * 'd))) * 'v>) =
source
|> Seq.map (fun ((x, (y, (z, a))), d) -> (x, y, z, a), d)
member inline this.Run(source:seq<('a * ('b * 'c)) * 'v>) =
source
|> Seq.map (fun ((x, (y, z)), d) -> (x, y, z), d)
member inline this.Run(source:seq<('a * 'b) * 'v>) =
source
|> Seq.map (fun ((x, y), d) -> (x, y), d)
member inline this.Run(source:seq<'a * 'v>) =
source
|> Seq.map (fun (x, d) -> x, d)
let intBuilder = IntBuilder ()
let c =
intBuilder {
for i in 1..2 do
for j in 1..2 do
for k in 1..2 do
for l in 1..2 ->
i + j + k + l
}
// What I get
c : seq<(int * (int * (int * int))) * int>
// What I want
c : seq<(int * int * int * int) * int>
В этом случае c
относится к типу seq<(int * (int * (int * int))) * int>
. Я хочу, чтобы вычисление IntBuilder
возвращало seq<(int * int * int * int), int>
. Как мне этого добиться?