В Haskell Proxy - значение типа свидетеля, которое упрощает передачу некоторых типов вокруг
data Proxy a = Proxy
Пример использования приведен в json-schema:
class JSONSchema a where
schema :: Proxy a -> Schema
чтобы вы могли сделать schema (Proxy :: Proxy (Int,Char))
, чтобы получить представление JSON для Int-Char -Tuple (возможно, массив).
Почему люди используют прокси? Мне кажется, что то же самое можно сделать с помощью
class JSONSchema a where
schema :: Schema a
аналогично тому, как работает класс Bounded
.
Сначала я подумал, что проще использовать схему некоторого заданного значения при использовании прокси, но это не похоже на правду:
{-# LANGUAGE ScopedTypeVariables #-}
schemaOf :: JSONSchema a => a -> Schema a
schemaOf (v :: x) = schema (Proxy :: Proxy x) -- With proxy
schemaOf (v :: x) = schema :: Schema x -- With `:: a`
schemaOf _ = schema -- Even simpler with `:: a`
Кроме того, можно подумать о том, действительно ли значения Proxy
были искоренены во время выполнения, что является проблемой оптимизации, которая не существует при использовании подхода :: a
.
Если подход :: a
, принятый Bounded
, дает тот же результат с более коротким кодом и меньше забот об оптимизации, почему люди используют прокси? Каковы преимущества прокси-серверов?
EDIT:. Некоторые ответы и комментаторы по праву отметили, что подход :: a
прикрывает тип data Schema = ...
параметром типа "бесполезный" - по крайней мере, с точки зрения самой простой структуры данных, который никогда не использует a
(здесь).
Предполагается использовать phantom тип Tagged s b
, что позволяет отделить две проблемы (Tagged a Schema
объединяет тип непараметрической схемы с переменной типа a
), которая строго лучше, чем подход :: a
.
Итак, мой вопрос должен быть лучше . Каковы преимущества прокси-сервера и меченый подход?