在单位的情况下如何理解米田的基数?

A Q*_*ker 1 haskell

请注意,这严格来说并不是一个 Haskell 问题,但这就是我一直在玩这个问题的地方,也是我看到 yoneda 引理表达得最干净的地方......

所以,根据 yoneda 引理,我们知道

forall x . (a -> x) -> f x ~= f a
Run Code Online (Sandbox Code Playgroud)

但我想知道的是,当 x 的基数比 a 低时,它对类型 x 是如何工作的?例如,单位...取 f=Identity, a=Integer, x=Unit 我们得到类似

(Integer -> ()) -> Indentity () ~= Identity Int
Run Code Online (Sandbox Code Playgroud)

这似乎没有意义?

我一直认为 yoneda 是这样的,比如 a=Bool 和 x=Int

(Bool -> Integer) -> Identity Integer ~= Identity Bool
Run Code Online (Sandbox Code Playgroud)

从某种意义上说,Identity Integer“似乎”比 Identity Bool 大,但鉴于它必须由 Bool->Integer 构建,我们知道实际上只有两种选择......但我觉得翻转一下,说明上述理解不太对。

我很感激任何帮助理解这一点!

ama*_*loy 6

你无法修复x ~ ()。为了保持身份,该函数必须适用于 的每一个选择x,而不仅仅是一个特定的选择。这就是为什么forall在那个参数上有一个。因此,让我们重铸您的示例,在x. 我给你一个以下类型的函数

(Integer -> x) -> Identity x
Run Code Online (Sandbox Code Playgroud)

承诺它适用于x您选择的任何产品。我可能实现这个函数的唯一方法是已经Integer在我手中,并调用你给我的函数,产生一个x. 因此,我的函数相当于一个Identity Integer.

同样,我们可以采取a ~ Bool, f ~ [],产生

(Bool -> x) -> [x]
Run Code Online (Sandbox Code Playgroud)

我可以实现这一点的唯一方法是,如果我[Bool]躺着,并用我Bool的每个s调用您的函数。

由于xmust 是多态的,它没有特定的基数,因此a不会出现比比更小或更大的问题。