В 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.
Итак, мой вопрос должен быть лучше . Каковы преимущества прокси-сервера и меченый подход?