Python中如何使用原生functional库实现无伤尾递归和模式匹配?

模式匹配用到的类型系统类似 ts。

pattern-matching

  • demo1
from pattern_matching.core.match import when, overwrite
from pattern_matching import var, Using
from numpy.random import randint

with Using(scope=locals(), use_tco=True): @overwrite((var, *var)) def qsort(head, tail): lowers = [i for i in tail if i < head] highers = [i for i in tail if i >= head] return qsort(lowers) + [head] + qsort(highers)

@when(var) def qsort(lst): return lst print(qsort(randint(0, 2000, size=(1200, ))))

  • demo2
from pattern_matching import Match, when, var, T, t, match_err, _, overwrite

@overwrite(_ == 1, var[int]) def u_func(res): return res

@when(var < 0, _) def u_func(): raise varueError(‘input should be positive.’)

@when(var[int] > 1, var) def u_func(now, res): return u_func(now-1, res*now)

@when(var[int]) def u_func(now): return u_func(now, 1)

u_func(10, 1) # => 3628800

大哥哥们有什么看法吗?


Python中如何使用原生functional库实现无伤尾递归和模式匹配?

8 回复

尾递归自动展开吗?和手写展开相比性能怎么样?


我无法理解你的问题。

资瓷一下~

还很慢,只能和普通递归比。主要动态模式匹配太耗时间。我这边 tco 是和 pattern matching 绑定的,现阶段只能说让函数栈深度最大不超过 3,但是优化还不完全。。

fn.py 太丑陋了,实现也太裸。我以前和那个作者在 mailing list 有点不愉快。有些东西(特指 fp)没有语法糖支持,根本就没那个感觉。


要搞 fp 还是用正统一点用 lisp 吧,学术一点 haskell, 前位一点 clojure, 混搭 scala

不一定呀,也有很多人只是想日常写代码能够写得舒服。。

说到 lisp… P.S: 我一直觉得 lisp 只是宏比较强能容易实现 fp 的组件罢了,haskell-like 才是真 fp…

回到顶部