Почему запросы к базе данных являются хорошим местом для использования стрелок?

Я читал это, в котором говорилось:

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

и это объясняет:

Статически известный "означает, что если у нас есть пара строк обозначения стрелки

> -- y <- action1 -< x

> -- z <- action2 -< y

тогда выражение action2 не может зависеть от x или от чего-либо, связанного с левой стороны строки обозначения стрелки.

Насколько я понимаю, это ограничение - то, что делает стрелки стоящими.

Теперь я пытался выучить Opaleye и заметил, что он использует стрелки для объединения вещей.

Почему Opaleye использует стрелки? Почему стрелы хорошо подходят для этой работы? Что такого в базах данных / запросах, которые делают это ограничение полезным?

2 ответа

Параметризованные запросы к базе данных выглядят как стрелки:

  • у каждого есть вход и выход
  • они составляют
  • мы хотим относиться к ним иначе, чем к функциям Haskell

Состав (.) (или же (<<<)) выглядит как подзапрос SQL. (&&&) выглядит как соединение SQL.

Я считаю, что "статически известное" ограничение относится к вещам, которые вы могли бы разумно перевести на SQL. Как только вы позволите fmap / lmap / rmap с произвольными функциями Haskell это невозможно (по крайней мере, без расширений языка SQL и плагинов компилятора GHC). Я не проработал детали, хотя.

Я не знаю, сколько переводов мы могли бы выполнить вручную, используя Opaleye.

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

Другие вопросы по тегам