斯威夫特的传感器

avi*_*ara 5 haskell functional-programming swift

我正在通过Haskell学习Swift中的函数式编程,并遇到了这个有趣的Transducers概念.一个代码示例实现了一个mapping基本上吐出传感器的函数,因为我们将转换规则作为参数传递.

灵感,我很快将其翻译成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))

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我现在的问题是注意转换函数如何从A转到B((A -> B)),但是转换器从B转到A(( (C,B) -> C) -> ( (C,A) -> C))?这是为什么?我确信这不是巧合,因为这个顺序很重要.哈斯克尔专家,有人吗?

Ben*_*Ben 4

查看f实际调用的位置。它将 an 转换A为 a B,结果用作 的参数r。因此r必须期待一个B;我们使用一个A -> B函数来预处理函数的输入(C, B) -> C,从而产生一个(C, A) -> C函数。

一般来说,每当我们改造系统以改变其“输入”时,这种逆转就会发生。如果我们改造一个系统来改变它的“输出”,就不存在逆转1

X -> A   --->   A -> B   --->   B -> Y
Run Code Online (Sandbox Code Playgroud)

如果我有一个A -> B函数并且我想用它来制作一些发出Ys 的东西,我需要将 a 映射到它的输出B -> Y函数上。这称为协方差,因为我想要更改的内容(Bin A -> B)“随”我映射到它的函数(B -> Y)而变化。据说B在 中处于积极的位置A -> B

如果我有一个A -> B函数并且我想用它来制作一些需要Xs 的东西,我需要X -> A在它的输入上映射一个函数。这被称为逆变,因为我想要改变的东西(Ain A -> B)“与我映射到它的函数()相反” X -> A。据说A中 处于不利位置A -> B


1高阶编程意味着我们可以改造一个系统,以改变某个东西的输出中的输入,该输入是“我们系统的输出”的输入......!术语“负位置”和“正位置”有助于暗示负数的负数是正数,等等。