Дано:Int -> Int список не совместим с типом Int -> IEnumerable <'a>
open System.Linq
это приемлемо выражение:
[2; 3; 4].SelectMany(fun n -> { 1..n })
однако это не так:
[2; 3; 4].SelectMany(fun n -> [ 1..n ])
В сообщении об ошибке говорится:
int -> int list
is not compatible with type
int -> System.Collections.Generic.IEnumerable<'a>
F # отклоняет выражение, потому что функция возвращает int list
.
Рассмотрим C# программу, которая делает что-то подобное:
using System;
using System.Collections.Generic;
using System.Linq;
namespace SelectManyCs
{
class Program
{
static List<int> Iota(int n)
{
var ls = new List<int>();
for (var i = 0; i < n; i++) ls.Add(i);
return ls;
}
static void Main(string[] args)
{
var seq = new List<int>() { 2, 3, 4 };
foreach (var elt in seq.SelectMany(Iota))
Console.WriteLine(elt);
}
}
}
Iota
возвращающую List<int>
и передавая ее SelectMany
приемлем для C#.
Является ли поведение F # по дизайну или это ошибка? Если это по дизайну, почему аналогичная операция работает на C#?
Чтобы уточнить, тип списка, используемый в программе C#, не совпадает с типом списка, используемым в F #: 'System.Collections.Generic.List' vs 'Microsoft.FSharp.Collections.List '. –