Вот моя попытка, используя сочетание linq и loop. (что означает, что IME можно сделать полностью в linq, рискуя усложнить чтение)
Сначала я сортирую входные данные с самыми длинными списками, а затем проверяю, существует ли существующий выходной файл, содержащий все элементы. на входе - если нет, я добавляю новый.
var yellow = 0;
var pink = 1;
var red = 2;
var white = 3;
var blue = 4;
var input = new List<List<int>> {
new List<int> { pink, yellow },
new List<int> { yellow, pink, red},
new List<int> { red, yellow},
new List<int> { white, blue},
new List<int> { blue, white}
};
var output = new List<List<int>>();
// Start with the longest lists
foreach (var item in input.OrderByDescending(x => x.Count))
{
// See if it will fit in an existing output value
var itemIsEntirelyContainedByExistingOutput = false;
foreach (var outputValue in output)
{
if (item.All(colour => outputValue.Contains(colour)))
{
itemIsEntirelyContainedByExistingOutput = true;
break;
}
}
// No, so add this to the list of outputs
if (!itemIsEntirelyContainedByExistingOutput)
{
output.Add(item);
}
}
Вот попытка сжать его в linq. На этом этапе отладку гораздо сложнее, хотя я надеюсь, что она по-прежнему читаема.
// Start with the longest lists
foreach (var item in input.OrderByDescending(x => x.Count))
{
// See if it will fit in an existing output value
if (!output.Any(x => item.All(x.Contains)))
{
// No, so add this to the list of outputs
output.Add(item);
}
}
Существует много различий, некоторые технические, некоторые социополитические. Я попытался поместить более важные различия сначала.
SML является языком с определением и стандартом. Это стабильно (и на самом деле был заморожен так, это не может развиться). Объективный Caml является реализацией, которой управляет небольшая группа в INRIA. Это продолжает развиваться. (IMO эволюция управляют хорошо.)
SML имеет много реализаций; Caml имеет всего один.
Объективный Caml имеет много дополнительных функций, среди которых самыми видными являются, вероятно, объекты и полиморфные варианты.
Эти два языка имеют существенно различные модели типов записи. Кратко, в Caml, имена рекордных полей должны быть уникальными, где в SML, у двух различных типов записи в том же объеме могут иметь общие имена полей. Эта причуда может сделать портирование от SML до Caml немного хитрым.
Существует довольно много синтаксических различий.
Библиотеки и стандартные функции существенно отличаются. Библиотека Caml очень обязательна, тогда как Базисная Библиотека Стандарта SML более функциональна. Например, композиция функций является примитивом верхнего уровня в SML; это не часть библиотеки Caml. Строковая библиотека Caml не обеспечивает функцию сгиба (по крайней мере, не с версии 3.08). Реализации многих Caml List
функции небезопасны для очень длинных списков; они уносят стек.
Системы типов тонко отличаются: В Caml, аннотации типа на выражение e : ty
принят если тип ty
объединяет с типом e
. В SML, e : ty
принят только если тип ty
экземпляр типа e
. Это различие представляет аннотацию в Caml, намного менее полезном на практике, потому что невозможно использовать аннотацию типа, чтобы настоять, что выражение является полиморфным.
Caml имеет намного более нормальные и разумные отношения между интерфейсами (названный типами модуля или подписями) и (конкретные) реализации (названный модулями или структурами), чем SML. В SML в значительной степени что-либо идет, и необходимо полагаться на программиста для установления хороших конвенций. В Caml хорошие конвенции устанавливаются и осуществляются компилятором.
В SML арифметические операторы перегружаются для применения к и и целочисленным данным с плавающей точкой. В Caml не перегружаются операторы; операторы с плавающей точкой записаны нотами с дополнительной точкой.
В SML программист может управлять приоритетом и associtivity инфиксных операторов. В Caml они определяются первым символом имени оператора. Это ограничение ограничивает преимущества способности определить Вашу собственную инфиксную нотацию.
Для более подробного анализа вместе с редакционным комментарием Вы могли также посмотреть на страницу сравнения Adam Chlipala.
Для получения дополнительной информации относительно синтаксических различий, которые Norman Ramsey упомянул, вот несколько веб-страниц:
OCaml добавляет опции объектной ориентации и имеет некоторые небольшие синтаксические различия.