Подтвердить что ты не робот

Существуют ли какие-либо связи между Haskell и LINQ?

Я написал несколько запросов в С#, используя LINQ. Через некоторое время я начал использовать Haskell немного, что является функциональным языком программирования (не очень популярным), и для меня кажется, что они оба почти одинаковы. Но я не уверен в этом. Пожалуйста, если кто-то использовал их больше, чем я, могли бы они сказать мне, являются ли они почти одинаковыми принципами в программировании?

Кроме того, можно ли LINQ считать функциональным программированием?

Спасибо.

4b9b3361

Ответ 1

для меня кажется, что они оба почти одинаковы. Но я не уверен в этом. Пожалуйста, если кто-то использовал их больше, чем я, могли бы они сказать мне, являются ли они почти одинаковыми принципами в программировании?

Да, дизайн запросов LINQ-запросов был в значительной степени зависеть от дизайна Haskell. Эксперт Haskell Эрик Мейер был в комитете по разработке языка С#, когда мы разработали LINQ; его идеи были очень ценными. (Я присоединился к команде дизайнеров в конце этого процесса, поэтому, к сожалению, я не смог участвовать во всех интересных поворотах и ​​превратил дизайн в течение многих лет, он стал гораздо более традиционным OO, чем это закончилось!)

Если вы недавно сделали серьезное исследование в Haskell, то вы, вероятно, знакомы с идеей монады. Синтаксис LINQ разработан специально для того, чтобы сделать операции над монадой последовательности естественными, но на самом деле реализация является более общей; что С# вызывает "SelectMany" - это слегка измененная форма операции "Bind" на произвольной монаде. Фактически вы можете использовать понимание запросов с любой монадой, как описывает здесь мой коллега Wes, но это выглядит довольно странно, и я рекомендую против него в производственном коде.

Кроме того, можно ли LINQ считать функциональным программированием?

Да, LINQ сильно зависит от идей функционального программирования. Он предназначен для обработки функций как объектов первого класса, для выделения вычислений по побочным эффектам и т.д.

Ответ 2

Возможно, стоит взглянуть на Лекция Эрика Мейера. Вот описание для него.

Мы начинаем лекции С9 с пути в мир функциональных Программирование с использованием функционального языка пурист и первосвященник лямбды исчисление, д-р Эрик Мейер (вы можете поблагодарить Эрика за многие из функциональных конструкций, которые проявились в такие языки, как С# и VB.NET. Когда ты используйте LINQ, спасибо Эрику в дополнение к Андерс).

Ответ 3

Верно, что С# получил некоторые аспекты функционального программирования. Прежде всего это выражение лямбда, выполненное как анонимный делегат. Теперь вам больше не нужно определять метод как принадлежащий объекту, и вы можете определить метод аналогично любой другой переменной. Это позволяет использовать многие конструкты функционального типа:

var mult = (a,b)=>a*b;
var square = (a)=>Math.Pow(a,2);
var multandsquare = (a,b)=>square(mult(a,b));

//None of the above give a lick about what a and b really are, until...
multandsquare(5,3); //== 225

Основная парадигма функционального программирования - что в принципе все, что вы можете сказать, что компьютер может сделать, можно сказать в терминах функций более высокого порядка - может применяться к программам С#, особенно теперь, когда С# на самом деле имеет функции более высокого порядка. Компилятор заставит вас иметь хотя бы один класс, по крайней мере, с одним общедоступным основным методом (таким образом, как работает OO), но с этого момента вы можете определить почти все только с точки зрения функций (def: подкласс "методов", которые принимают N параметров и производят 1 выход без "побочных эффектов" ), созданных в виде лямбда.

Linq имеет некоторую функциональную структуру. В принципе его парадигма метода-метода является примером монадической обработки, а именно, как последовательности операций структурируются посредством инкапсуляции операций на функциональных языках (а теперь и на С#). Вызов метода Linq в IEnumerable возвращает другой IEnumerable, который действительно является другим конкретным классом, который содержит дескриптор источника Enumerable и некоторую lambda для выполнения. Вы можете просто воспроизвести его на функциональном языке; это кортеж источника (сам кортеж текущего элемента и всего остального) и функция для выполнения, которая преобразует исходный кортеж в результат, по одному элементу за раз (что в Linq, так как оно будет реализовано в функциональном language, является вложением некоторой операции в определенную функцию "rollup" ). Вызовите метод, который должен дать фактический ответ (конкретный типизированный результат), и все эти функции оцениваются достаточно для получения желаемого результата.

Ответ 4

Также можно было бы использовать LINQ функциональное программирование?

LINQ подразумевает функциональный стиль, в котором он похож, например, на выбор SQL, который доступен только для чтения. Однако, поскольку предложения LINQ в .NET реализованы с помощью простых CLR-подпрограмм, нет ничего, что могло бы помешать выражениям LINQ изменять состояние.

Haskell, с другой стороны, является "чистым" функциональным языком, поэтому выражения не могут изменять глобальное состояние. Хотя можно выполнять операции ввода-вывода и графики, они выполняются с использованием совершенно другой идиомы из чего-либо в .NET - в том числе F #, что позволяет более или менее прозрачно перейти в процедурный стиль.