【发布时间】:2018-08-22 02:22:20
【问题描述】:
我只是在查看map :: (a -> b) -> [a] -> [b] 的类型,而这个函数的形状让我想知道我们是否可以将列表形成运算符 [ ] 视为遵循普通模态逻辑常见的各种公理(例如,T、S4、 S5, B),因为我们似乎至少有正常模态逻辑的 K 公理,[(a -> b)] -> [a] -> [b]。
这引出了我的问题:Haskell 中是否有熟悉的、有趣的运算符或函子,它们具有某种模态运算符的语法,并且遵循普通模态逻辑的公理(即 K、T、S4、 S5 和 B)?
这个问题可以更尖锐,更具体。考虑一个运算符L 及其对偶M。现在问题变成了:Haskell 中是否有任何熟悉的、有趣的运算符具有以下一些属性:
(1)L(a -> b) -> La -> Lb
(2)La -> a
(3)Ma -> L(M a)
(4)La -> L(L a)
(5)a -> L(M a)
看到一些很好的例子会很有趣。
我想到了一个潜在的例子,但最好知道我是否正确:将L 作为not not 和M 作为not 的双重否定翻译。这种转换将每个公式a 转换为它的双重否定转换(a -> ⊥) -> ⊥,并且至关重要的是,验证了公理 (1)-(4),但不验证公理 (5)。我在这里问了一个问题https://math.stackexchange.com/questions/2347437/continuations-in-mathematics-nice-examples,似乎双重否定翻译可以通过延续单子来模拟,endofunctor 将每个公式a 带到它的双重否定翻译(a -> ⊥) -> ⊥。 Derek Elkins 注意到存在一些双重否定翻译,通过 Curry-Howard 同构,对应于不同的连续传递风格变换,例如Kolmogorov 对应于按名称调用的 CPS 变换。
也许还有其他操作可以通过 Haskell 在 continuation monad 中完成,这些操作可以验证公理 (1)-(5)。
(只是为了消除一个例子:所谓的 Lax 逻辑 https://www.sciencedirect.com/science/article/pii/S0890540197926274 和 Haskell 中的 Monads 之间有明确的关系,返回操作遵循该逻辑的模态运算符(它是一个内函子)的规律。我对这些示例不太感兴趣,但对遵循经典正态模态逻辑中模态运算符的一些公理的 Haskell 运算符的示例感兴趣)
【问题讨论】:
-
我不知道你的问题是什么,但
[a -> b] -> [a] -> [b]是(<*>)的类型,专门用于[]的Applicative实例。 -
我们有
(<*>) :: [a -> b] -> [a] -> [b],对于“功能模态”,我们有(<*>) :: (e -> (a -> b)) -> (e -> a) -> (e -> b),这是众所周知的K组合子。不过,他们共享 K 名称可能只是巧合。 ;-) -
关于“太宽泛”的近距离投票:FWIW,我觉得这个问题不应该被关闭。它是以一种相当投机的方式表达的(可能是由于 OP 不熟悉 Haskell,在问题的原始修订中提到了这一点);然而,其核心是一个相当合理的问题,即函子类是否与模态运算符有关。
-
L确实看起来像个共生体,但不确定对应的M会是什么。但是例如已知的comonads,例如a的非空列表,(w,a)的对将满足。 -
您绝对应该阅读Getting a Quick Fix on Comonads,它主张(限制使用)
ComonadApply用于某些模态逻辑。
标签: haskell modal-logic