在范畴论中,可以证明身份函数是唯一的。还可以说,根据参数论证,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。但是怎么可能呢? 10/5和1 + 1也是最小的素数。所有这些语句可能一次全部成立,因为10/5实际上与2是同一回事,就像您编写的所有表达式都与恒等函数一样。

关于haskell - Haskell中的身份功能有多个居民吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61497677/

10-09 02:53