请注意,这严格来说并不是一个 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 构建,我们知道实际上只有两种选择......但我觉得翻转一下,说明上述理解不太对。
我很感激任何帮助理解这一点!
你无法修复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不会出现比比更小或更大的问题。