我正在通过
Haskell学习
Swift中的函数式编程,并遇到了这个有趣的Transducers概念.一个代码示例实现了一个映射函数,它基本上吐出一个传感器,因为我们将转换规则作为参数传递.
灵感,我很快将其翻译成Swift等价物,这就是我得到的:
func mapping < A,B,C> (f: A -> B) -> ( ( (C,B) -> C) -> ( (C,A) -> C) ) { return { r in return { result,a in return r(result,f(a)) } } }
我现在的问题是注意转换函数如何从A到B((A – > B)),但是换能器从B变为A(((C,B) – > C) – >((( C,A) – > C))?这是为什么?我确信这不是巧合,因为这个顺序很重要.哈斯克尔专家,有人吗?
解决方法
看看实际发生f的调用.它将A转换为B,结果用作r的参数.因此r必须期待B;我们正在使用A – > B用于预处理输入到(C,B) – > C函数,得到(C,A) – > C功能.
通常,只要我们改变系统以改变其“输入”,就会发生这种逆转.如果我们正在改造一个系统来改变它的“输出”,那就没有逆转1.
X -> A ---> A -> B ---> B -> Y
如果我有一个A – > B函数,我想从它做出一些发出Ys的东西,我需要映射一下它的输出B – > Y功能.这被称为协方差,因为我想要改变的事物(A中的B – > B)“随着我在其上映射的函数(B – > Y)而变化.据说B在A – >中处于积极的位置. B.
如果我有一个A – > B函数,我想从它做一些取代Xs的东西,我需要映射一个X – >一个功能超过其输入.这被称为逆变,因为我想要改变的东西(A中的A – > B)“与我映射的函数(X – > A)不同”.据说A在A – >中处于负位置. B.
1高阶编程意味着我们可以转换一个系统来改变输出中的输入,这些输入是我们系统输出的输出……!“负位置”和“正位置”这两个术语有助于暗示否定的消极是积极的,等等.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。