模式匹配用到的类型系统类似 ts。
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, ))))
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
大哥哥们有什么看法吗?
1
guyskk0x0 2018-01-08 09:32:38 +08:00 via Android
尾递归自动展开吗?和手写展开相比性能怎么样?
|
2
WoodenRobot 2018-01-08 10:05:33 +08:00
资瓷一下~
|
3
thautwarm OP @guyskk0x0 还很慢,只能和普通递归比。主要动态模式匹配太耗时间。我这边 tco 是和 pattern matching 绑定的,现阶段只能说让函数栈深度最大不超过 3,但是优化还不完全。。
|
4
xpresslink 2018-01-08 11:40:28 +08:00
|
5
thautwarm OP @xpresslink fn.py 太丑陋了,实现也太裸。我以前和那个作者在 mailing list 有点不愉快。有些东西(特指 fp)没有语法糖支持,根本就没那个感觉。
|
6
xpresslink 2018-01-08 15:57:32 +08:00
@thautwarm
要搞 fp 还是用正统一点用 lisp 吧,学术一点 haskell, 前位一点 clojure, 混搭 scala |
7
thautwarm OP @xpresslink 不一定呀,也有很多人只是想日常写代码能够写得舒服。。
说到 lisp... P.S: 我一直觉得 lisp 只是宏比较强能容易实现 fp 的组件罢了,haskell-like 才是真 fp... |