Каковы различия между SML и OCaml? [закрытый]

Вот моя попытка, используя сочетание 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);
            }
        }
96
задан Lii 7 September 2017 в 14:01
поделиться

3 ответа

Существует много различий, некоторые технические, некоторые социополитические. Я попытался поместить более важные различия сначала.

  • 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.

155
ответ дан Norman Ramsey 24 November 2019 в 05:38
поделиться

Для получения дополнительной информации относительно синтаксических различий, которые Norman Ramsey упомянул, вот несколько веб-страниц:

30
ответ дан bk1e 24 November 2019 в 05:38
поделиться

OCaml добавляет опции объектной ориентации и имеет некоторые небольшие синтаксические различия.

-3
ответ дан Charlie Martin 24 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: