В этом ответе я предполагаю, что вы говорите о filter
на Set
(ситуация кажется более запутанной для других типов данных).
Давайте сначала исправим то, о чем мы говорим.Я конкретно расскажу о следующей функции (в Scala):
def filter[A](p: A => Boolean): Set[A] => Set[A] =
s => s filter p
Когда мы запишем ее таким образом, мы ясно увидим, что это полиморфная функция с параметром типа A
, которая отображает предикаты A => Boolean
функциям, которые отображают Set[A]
на другие Set[A]
.Чтобы сделать его «морфизмом», нам нужно было бы сначала найти несколько категорий, в которых эта вещь могла бы быть «морфизмом».Можно было бы надеяться, что это естественное преобразование и, следовательно, морфизм в категории эндофункторов в «стандартной по умолчанию эмбиентной структуре категории», обычно называемой «Hask
» (или «Scal
»? «Scala
»?).Чтобы показать, что это естественно, мы должны были бы проверить, что следующая диаграмма коммутирует для каждого f: B => A
:
- o f
Hom[A, Boolean] ---------------------> Hom[B, Boolean]
| |
| |
| |
| filter[A] | filter[B]
| |
V ??? V
Hom[Set[A], Set[A]] ---------------> Hom[Set[B], Set[B]]
однако, здесь мы немедленно терпим неудачу, потому что не ясно, что даже положить на горизонтальную стрелкувнизу, поскольку присваивание A -> Hom[Set[A], Set[A]]
даже не кажется функторным (по тем же причинам, почему A -> End[A]
не является функторным, см. здесь , а также здесь ).
Единственная "категориальная" структура, которую я вижу здесь для fixed type A
, заключается в следующем:
- Предикаты на
A
можно считатьчастично упорядоченный набор с подтекстом, то есть p LEQ q
, если p
подразумевает q
(то есть либо p(x)
должно быть ложным, либо q(x)
должно быть истинным для всех x: A
). - Аналогично, для функций
Set[A] => Set[A]
мы можем определить частичный порядок с помощью f LEQ g
всякий раз, когда для каждого набора s: Set[A]
утверждается, что f(s)
является подмножеством g(s)
.
Тогда filter[A]
будет монотонным и, следовательно, функтором между категориями poset.Но это немного скучно.
Конечно, для каждого фиксированного A
оно (или, скорее, его eta-расширение) также является просто функцией от A => Boolean
до Set[A] => Set[A]
, так что это автоматически "морфизм" в "Hask
-category».Но это еще скучнее.