Может кто-нибудь объяснить мне, для чего предназначена библиотека Shapeless?

Может кто-нибудь объяснить мне простыми словами, для чего предназначена библиотека Shapeless?

Scala имеет общие функции и функции наследования, поэтому я немного запутался в том, что такое Shapeless.

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

Ответ 1

Немного сложно объяснить, поскольку бесформенный имеет широкий спектр возможностей; Вероятно, мне было бы легче "объяснить, просто словами, какие переменные для". Вы определенно хотите начать с обзор функций.

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

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

  • Прочитайте кучу значений где-нибудь в List
  • выполнить тип безопасности List в HList
  • отобразите это значение HList с помощью полиморфной функции, например, нормализует значения
  • преобразовать 3-й элемент (который статически известен как Int) в строку с добавлением 0
  • построить класс case, используя значения из HList

Для справки HList будет иметь точный тип, например Int :: String :: Boolean :: HNil (да, это действительно единственный тип), где все закреплено и размер фиксирован. Таким образом, вам либо нужно знать во время компиляции точно, что будет в вашем HList, либо вам нужен тип безопасности.

Если вы берете tail такого HList, вы получаете String :: Boolean :: HNil и гарантию времени компиляции, что голова этого будет String. Превращение значения в голову будет также сохранять все типы.

Shapeless также поставляется с классом типа Generic, что позволяет использовать операции HList для кортежей и классов case.

Другие функции, которые я обычно использую, следующие:

  • Coproducts, которые позволяют статически вводить значение, например. "a String, Double или Int, но ничего больше" (как Either, но не ограничиваясь только двумя возможностями)

  • Lenses, которые упрощают работу с вложенными классами case.

Ответ 2

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

val myList = 1 :: 2 :: "3" :: fred :: Nil

Каков тип myList здесь? Если бы вы его осмотрели, вы бы увидели, что он имеет тип List[Any]. Это не очень полезно. Что еще менее полезно, если я попытался использовать следующие PartialFunction[Any] to map над ним:

myList.map{
  case x: Int => x
  case x: String => Int.parseInt(x)
}

Во время выполнения это может вызвать MatchError, потому что я на самом деле не сказал вам, какой тип fred. Он может иметь тип fred.

При значении HList вы можете знать сразу во время компиляции, если не удалось захватить один из типов этого списка. В приведенном выше случае, если бы я определил myList = 1 :: 2 :: "3" :: fred :: HNil, когда я обратился к 3-му элементу, это будет String, и это будет известно во время компиляции.

Как указывает @KevinWright, там больше, чем с Shapeless, но HList является одной из определяющих функций библиотеки.

Ответ 3

Все в Shapeless имеет две общие черты:

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

(но это не полностью произвольный захват, потому что:)

Во-вторых, все в Shapeless обеспечивает повышенную проверку и безопасность во время компиляции. Ничто в Shapeless (что я могу думать?) На самом деле "что-то" делает во время выполнения. Все интересные действия происходят, когда ваш код компилируется. Цель всегда заключается в уверенности в том, что, если ваш код вообще компилируется, он не будет терпеть крах или сделать что-то не так во время выполнения. (Значит, это примечание: https://twitter.com/mergeconflict/status/304090286659866624)

Есть хорошее представление о том, что такое программирование на уровне, со ссылками на дополнительные ресурсы, на fooobar.com/info/1533/....