How to make a curry version of map that always returns list using toolz
如果我使用导入toolz
1 | from toolz.curried import * |
那么,
1 | map(func,[[1,2],[3,4]]) |
可以写为
1 | map(func)([[1,2],[3,4]]) |
但是curried
1 | lmap=compose(list,map) |
不会工作,例如
1 | lmap(len)([[1,2],[3,4]]) |
将给予
--------------------------------------------------------------------------- TypeError Traceback (most recent call
last) in ()
----> 1 lmap(len)([[1,2],[3,4]])C:\ProgramData\Anaconda3\lib\site-packages\toolz\functoolz.py in
call(self, *args, **kwargs)
466 ret = self.first(*args, **kwargs)
467 for f in self.funcs:
--> 468 ret = f(ret)
469 return ret
470TypeError: 'curry' object is not iterable
那么如何定义课程
你说的不对。传递给compose的
1 | lmap(len)([[1,2],[3,4]]) |
它将
1 | map(len) |
然后打电话给
1 | list(map(len)) |
这显然行不通。如果它没有失败,完整表达式将等价于:
1 | list(map(len))([[1,2],[3,4]]) |
当你要找的电话是:
1 | list(map(len), [[1,2],[3,4]]) |
所以事实上,这里的货币兑换没有什么意义。
你可能想在这些线条周围做些什么:
1 | def lmap(g): return compose(list, map(g)) |
您可以随意调用:
1 2 | >>> lmap(len)([[1,2],[3,4]]) [2, 2] |
但坦诚地说,这个问题看起来有点虚假——EDCOX1在统一懒惰中的最大优势5。转换为EDCOX1,4,则抛出大部分。