首页 > 解决方案 > 为 Functor 正确实现 fmap?

问题描述

所以,我最近一直在尝试围绕 Functors、Applicatives 和 Monads 进行思考。据我了解,这种设计模式允许将“纯函数”与“不纯”函数分开,并确保不会从给定函数分支和调用不同的函数并导致副作用

所以,假设我有一本字典,想在上面应用/编写一些函数。

input = {"x": 2, "y": 5, "out": None}

def f(x):
    return x + 2

def g(y):
    return y - 3

def h(x, y):
    return x * y

class Functor:

    def __init__(self, input):
        self.input = input

    def fmap(self, function):
        val = self.input
        if function.__name__ == "f":
            val["x"] = function(val["x"])
        elif function.__name__ == "g":
            val["y"] = function(val["y"])
        elif function.__name__ == "h":
            val["out"] = function(val["x"], val["y"])
        elif function.__name__ == "print":
            function(val)
        else:
            print("fmap not defined for this function!")
        return Functor(val)

    def __rshift__(self, function):
        return self.fmap(function)

Functor(input) >> f >> g >> h >> print #results in {"x": 4, "y": 2, "out": 8}
Functor(input) >> h >> g >> h >> print #results in {"x": 2, "y": 2, "out": 4}
Functor(input) >> g >> f >> h >> print #results in {"x": 4, "y": 2, "out": 8}

那么,我对函子的理解正确吗?如果是,这是实现fmap的方式,还是您在每个函数周围创建一个包装器以便在各自的包装器内定义fmap或什么?而且,这是跟踪输入状态、发布功能应用程序的方法吗?

标签: pythonfunctional-programmingfunctorapplicative

解决方案


推荐阅读