假设我们想要一个函数log
接受任何函数,包装函数并记录函数的输入/输出。像这样的伪代码:
func log(func f, input) {
var output = f(input);
log_data(input);
log_data(output);
}
在Haskell中这怎么可能?如何在函数调用中定义具有一般输入列表的通用函数指针?这可能类似于用于loggin的Python装饰器。
更具体一点,我想要一个通用机制来为我的应用程序中的所有函数的输入/输出添加日志记录。当然,这可以通过为每个函数添加两行代码来记录输入和输出,但我想要一个适用于任何输入的所有函数的通用解决方案。
Python中的示例日志装饰器:
def logged(f):
@wraps(f)
def wrapped(*args, **kwargs):
print "Logging..."
r = f(*args, **kwargs)
print "Call finished"
return r
return wrapped
@logged
def myfunc(myarg):
print "my function", myarg
return "return value"