Что такое декларативное программирование? [закрытый]

С Swift 3, в соответствии с вашими потребностями и вкусами, вы можете выбрать один из пяти следующих способов слияния / слияния двух массивов.


1. Объединение двух массивов в новый массив с помощью Swift standard library [Int] универсального оператора [Int]

Стандартная библиотека Swift определяет универсальный оператор +(_:_:). +(_:_:) имеет следующее объявление :

func +(lhs: RRC1, rhs: RRC2) -> RRC1

Создает новую коллекцию, объединяя элементы двух коллекций.

blockquote>

] Следующий код игровой площадки показывает, как объединить два массива типа [Int] в новый массив, используя общий оператор +(_:_:):

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = array1 + array2
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

2. Добавление массива в другой массив с помощью метода Array append(contentsOf:)

Swift Array имеет метод append(contentsOf:). append(contentsOf:) имеет следующее объявление :

public mutating func append(contentsOf newElements: S) where S : Sequence, S.Iterator.Element == Element)

Добавляет элементы последовательности или коллекции в конец этой коллекции.

blockquote >

Следующий код игровой площадки показывает, как добавить массив к другому массиву типа [Int] с использованием метода append(contentsOf:):

var array1 = [1, 2, 3]
let array2 = [4, 5, 6]

array1.append(contentsOf: array2)
print(array1) // prints [1, 2, 3, 4, 5, 6]

3. Слияние двух массивов в новый массив с помощью метода Sequence flatMap(_:)

Swift предоставляет метод flatMap(_:) для всех типов, соответствующих протоколу Sequence (включая Array). flatMap(_:) имеет следующее объявление :

func flatMap(_ transform: (Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]

Возвращает массив, содержащий конкатенированные результаты вызова данного преобразования с каждым элементом этой последовательности.

blockquote>

Следующий код игровой площадки показывает, как объединить два массива типа [Int] в новый массив с использованием метода flatMap(_:):

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = [array1, array2].flatMap({ (element: [Int]) -> [Int] in
    return element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

4. Объедините два массива в новый массив с помощью метода Sequence Sequence Sequence и Array init(_:) инициализатор

. Swift предоставляет метод joined() для всех типов, соответствующих Sequence протокол (включая Array). joined() имеет следующее объявление :

func joined() -> FlattenSequence

Возвращает элементы этой последовательности последовательностей, конкатенированные.

blockquote>

Кроме того, Swift Array имеет инициализатор init(_:). init(_:) имеет следующее объявление :

init(_ s: S)

Создает массив, содержащий элементы последовательности.

blockquote>

Поэтому , следующий код игровой площадки показывает, как объединить два массива типа [Int] в новый массив с использованием метода joined() и init(_:) initializer:

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenCollection = [array1, array2].joined() // type: FlattenBidirectionalCollection<[Array]>
let flattenArray = Array(flattenCollection)
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

5. Слияние двух массивов в новый массив с помощью метода Array reduce(_:_:)

Swift Array имеет метод reduce(_:_:). reduce(_:_:) имеет следующее объявление :

func reduce(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

Возвращает результат вызова данного замыкающего замыкания с каждым элементом этой последовательности и накопительным значением.

blockquote>

Следующий код игровой площадки показывает, как объединить два массива типа [Int] в новый массив с использованием метода reduce(_:_:):

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = [array1, array2].reduce([], { (result: [Int], element: [Int]) -> [Int] in
    return result + element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

184
задан Sam Hasler 29 September 2008 в 11:25
поделиться

10 ответов

Декларативное программирование состоит в том, когда Вы пишете свой код таким способом, которым это описывает то, что Вы хотите сделать, и не, как Вы хотите сделать это. Это оставляют до компилятора выяснить как.

Примерами языков декларативного программирования является SQL и Пролог.

139
ответ дан Aquarius_Girl 4 November 2019 в 15:34
поделиться

Я объяснил бы его, поскольку DP является способом выразить

  • А выражение цели, условия для - что мы ищем. Есть ли один, возможно, или многие?
  • Некоторые известные факты
  • Правила, которые расширяют знать факты

... и где существует вычитать механизм, обычно работающий с объединение алгоритм для нахождения целей.

1
ответ дан epatel 4 November 2019 в 15:34
поделиться

Пара других примеров декларативного программирования:

  • разметка ASP.NET для привязки данных. Это просто говорит, "заполняют эту сетку этим источником", например, и оставляет это системе для того, как это происходит.
  • выражения Linq

Декларативное программирование хорошо, потому что оно может помочь , упрощают Вашу умственную модель * кода, и потому что это могло бы в конечном счете быть более масштабируемо.

, Например, скажем, у Вас есть функция, которая делает что-то к каждому элементу в массиве или списке. Традиционный код был бы похож на это:

foreach (object item in MyList)
{
   DoSomething(item);
}

Никакое грандиозное предприятие там. Но что, если Вы используете более - декларативный синтаксис и вместо этого определяете DoSomething () как Действие? Тогда можно сказать это этот путь:

MyList.ForEach(DoSometing);

Это, конечно, более кратко. Но я уверен, что у Вас есть больше проблем, чем просто сохранение двух строк кода тут и там. Производительность, например. Старый путь, обрабатывая должен был быть сделан в последовательности. Что, если.ForEach () метод имел способ для Вас сигнализировать, что это могло обработать обработку параллельно, автоматически? Теперь внезапно Вы сделали свой код многопоточным очень безопасным способом и только изменили одну строку кода. И, на самом деле, существует расширение для.Net, который позволяет Вам сделать просто это.

  • , Если Вы переходите по той ссылке, она берет Вас к сообщению в блоге моим другом. Целое сообщение немного длинно, но можно прокрутить вниз к заголовку, названному "проблема" _and, берут его там без проблем.*
-2
ответ дан Joel Coehoorn 4 November 2019 в 15:34
поделиться

Насколько я могу сказать, это начало использоваться описывать системы программирования как Пролог, потому что пролог (предположительно), об объявлении вещей абстрактным способом.

Это все больше означает очень мало, поскольку этому дали определение пользователи выше. Должно быть ясно, что существует залив между декларативным программированием Haskell, по сравнению с декларативным программированием HTML.

-1
ответ дан Marcin 4 November 2019 в 15:34
поделиться

Описание к компьютеру, что Вы хотите, не, как сделать что-то.

5
ответ дан denonde 4 November 2019 в 15:34
поделиться

вообразите страницу Excel. Со столбцами, заполненными с формулами для вычисления Вас налоговая декларация.

Вся логика сделана объявленная в ячейках, порядок вычисления, определяют самой формулой, а не процедурно.

, Который является видом того, о чем декларативное программирование - все. Вы объявляете пространство задач и решение, а не поток программы.

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

6
ответ дан paan 4 November 2019 в 15:34
поделиться

Декларативное программирование является изображением, где императивное программирование является инструкциями для рисования того изображения.

Вы пишете в декларативном стиле, если Вы "Говорите его, что это", вместо того, чтобы описать шаги, которые компьютер должен сделать для получения туда, где Вы хотите его.

при использовании XML для данных разметки Вы используете декларативное программирование, потому что Вы говорите, что "Это - человек, который является днем рождения, и там является конкретным адресом".

Некоторые примеры того, где декларативное и императивное программирование объединено для большего эффекта:

  • Windows Presentation Foundation использует декларативный синтаксис XML для описания то, на что пользовательский интерфейс похож, и что отношения (привязка) между средствами управления и базовыми структурами данных.

  • Структурированные конфигурационные файлы используют декларативный синтаксис (в качестве простого как "key=value" пары) для идентификации то, что означают строка или значение данных.

  • HTML повышает текст с тегами, которые описывают, какую роль каждая часть текста имеет относительно целого документа.

8
ответ дан Chris Wenham 4 November 2019 в 15:34
поделиться

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

Независимость Контекста

Декларативные Программы независимы от контекста . Поскольку они только объявляют, какова конечная цель, но не посредник ступает для достижения той цели, та же программа может использоваться в различных контекстах. Это трудно относится обязательные программы , потому что они часто зависят от контекста (например, скрытое состояние).

Берут yacc в качестве примера. Это - парсер-генератор иначе. компилятор компилятора, внешний декларативный DSL для описания грамматики языка, так, чтобы синтаксический анализатор для того языка мог автоматически быть сгенерирован из описания. Из-за его независимости контекста можно сделать много разных вещей с такой грамматикой:

  • Генерируют синтаксический анализатор C для той грамматики (исходный вариант использования для yacc)
  • Генерируют синтаксический анализатор C++ для той грамматики
  • , Генерируют синтаксический анализатор Java для той грамматики (использующий Jay)
  • , Генерируют синтаксический анализатор C# для той грамматики (использующий GPPG)
  • , Генерируют синтаксический анализатор Ruby для той грамматики (использующий Racc)
  • , Генерируют древовидную визуализацию для той грамматики (использующий GraphViz)
  • , просто делают некоторую симпатичную печать, форматирующую воображение и подсветку синтаксиса самого yacc исходного файла и включают его в Ваш Справочник как синтаксическая спецификация Вашего языка

И намного больше …

Оптимизация

, поскольку Вы не предписываете компьютер, который ступает для взятия и в том, какой порядок, это может перестроить программу намного более свободно, возможно, даже, выполняют некоторые задачи параллельно. Хорошим примером является планировщик запроса и оптимизатор запросов для базы данных SQL. Большинство баз данных SQL позволяет Вам отображать запрос, что они на самом деле выполнение по сравнению с запросом, который Вы попросили их выполнять. Часто, те запросы взгляд ничто друг как друг. Планировщик запроса берет вещи во внимание, что Вы даже не мечтали бы о: вращательная задержка подложки диска, например, или того, что некоторое совершенно другое приложение для совершенно другого пользователя просто выполнило подобный запрос и таблицу, к которой Вы присоединяетесь и что Вы упорно работали так, чтобы не загружаться, уже находится в памяти так или иначе.

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

77
ответ дан Jörg W Mittag 4 November 2019 в 15:34
поделиться

Это - метод программирования основанного вокруг описания , что что-то должно сделать или быть вместо того, чтобы описать , как это должно работать.

, Другими словами, Вы не пишете алгоритмы, сделанные из выражений, Вы просто расположение, как Вы хотите вещи быть. Двумя хорошими примерами является HTML и WPF.

статья This Wikipedia является хорошим обзором: http://en.wikipedia.org/wiki/Declarative_programming

5
ответ дан Kevin Berridge 4 November 2019 в 15:34
поделиться

Это может показаться странным, но я бы добавил Excel (или любую другую электронную таблицу) в список декларативных систем. Хорошим примером этого является здесь .

2
ответ дан 23 November 2019 в 05:54
поделиться
Другие вопросы по тегам:

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