Функция идентичности в Haskell имеет несколько жителей? - PullRequest
7 голосов
/ 29 апреля 2020

В теории категорий можно доказать, что функция тождества уникальна. Говорят также, что с параметрической аргументацией тип forall a. a -> a имеет только одного обитателя. В Haskell хотя я могу придумать больше реализаций функции тождества:

id x = x
id x = fst (x, "useless")
id x = head [x]
id x = (\x -> x) x
id x = (\x -> (\x -> x) x) x

Как понять утверждение «функция тождества уникальна» и «любая функция с типом forall a. a -> a имеет только один житель ", когда есть несколько реализаций?

Ответы [ 2 ]

13 голосов
/ 29 апреля 2020

Все они похожи на одного и того же жителя для меня. Чтобы показать, что они разные, постарайтесь создать вход, для которого они ведут себя по-разному. Если вы не можете, на самом деле они должны быть одной и той же функцией, реализованной по-разному.

Рассмотрим аналог из другой дисциплины. В теории чисел можно доказать, что существует одно единственное наименьшее простое число, а именно 2. Но как это может быть? 10/5 также наименьшее простое число, равно как 1 + 1. Возможно, что все эти утверждения будут истинными сразу, потому что 10/5 - это то же самое, что и 2, так же как все написанные вами выражения - это то же самое, что и функция тождества.

5 голосов
/ 29 апреля 2020

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

...