Зависимость класса типов от tagless-final

После просмотра "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 ответ

Решение

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

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

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

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