Зависимость класса типов от tagless-final - PullRequest
0 голосов
/ 27 января 2019

После просмотра "FP to the Max" Джона Де Гоэса (https://www.youtube.com/watch?v=sxudIMiOo68)) я задаюсь вопросом о подходах к написанию программ FP в шаблоне tagless-final.

Скажем, у меня есть класс типов для моделирования побочных эффектов (на примере Console):

trait Console[F[_]] {
  def putStrLn(str: String): F[Unit]
  def getStrLn: F[String]
}

Как бы вы зависели от Console?

Косвенно

Как показано в его видео:

def inputLength[F[_]: Functor: Console]: F[Int] =
  Console[F].getStrLn.map(_.length)

Плюсы : подпись функции чистая, и вы можете воспользоваться автоматическим производным класса типов

Явное

Путем прямой передачи экземпляра функции:

def inputLength[F[_]: Functor](console: Console[F]): F[Int] =
  console.getStrLn.map(_.length)

Плюсы: Это позволяет вам явно привязывать ваши зависимости в соответствии с вашими потребностями и чувствует себя менее "волшебным"

Не уверен, что лучший / самый идиоматичный способ написания этой функции, был бы признателен за ваше мнение.

Спасибо!

1 Ответ

0 голосов
/ 27 января 2019

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

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

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

...