curry-uncurry同构可以表示为Reader monad中各种“高阶”程序之间的可逆映射(忽略包装以保持简洁):
type R r a = r -> a
uncurryR :: R r (R s a) -> R (r, s) a
uncurryR m (r, s) = m r s
curryR :: R (r, s) a -> R r (R s a)
curryR m r s = m (r, s)
我对uncurryS
的状态 - monadic版本感兴趣,如下所示:
type S r a = r -> (a, r)
uncurryS :: S r (S s a) -> S (r, s) a
uncurryS m (r, s) = (v, (t, u))
where (n, t) = m r
(v, u) = n s
当然,与uncurryR
不同,unCurryS
不是同构:S (r, s) a
通常比S r (S s a)
更“大”。
我是一名学术语言学家,并且没有详细介绍 ,R
和S
之间关于他们的“不作为”操作的区别 - 即,无论它们是同构 - 对于思考自然语言的形式语义中的各种问题(不管你信不信!)都是重要的。
一般来说,当构造看起来与自然语言语义相关时,我发现在可能的范围内追逐计算机科学和范畴理论中的联系是有帮助的。为此,我非常有兴趣知道在函数式编程文献中或在更多的分类术语中已经讨论过任何相关问题。对不起,我不能更具体,但我感谢任何帮助和任何指示。