Python中如何使用原生functional库实现无伤尾递归和模式匹配?
模式匹配用到的类型系统类似 ts。
- 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库实现无伤尾递归和模式匹配?
尾递归自动展开吗?和手写展开相比性能怎么样?
我无法理解你的问题。
资瓷一下~
还很慢,只能和普通递归比。主要动态模式匹配太耗时间。我这边 tco 是和 pattern matching 绑定的,现阶段只能说让函数栈深度最大不超过 3,但是优化还不完全。。
小玩 fn 可以移情
https://github.com/kachayev/fn.py
疯玩 fn 可能失神
http://docs.hylang.org/en/stable/
fn.py 太丑陋了,实现也太裸。我以前和那个作者在 mailing list 有点不愉快。有些东西(特指 fp)没有语法糖支持,根本就没那个感觉。
要搞 fp 还是用正统一点用 lisp 吧,学术一点 haskell, 前位一点 clojure, 混搭 scala
不一定呀,也有很多人只是想日常写代码能够写得舒服。。
说到 lisp… P.S: 我一直觉得 lisp 只是宏比较强能容易实现 fp 的组件罢了,haskell-like 才是真 fp…

