安利框架,原生 Python 的 functional 库,无伤尾递归加模式匹配。

2018-01-08 03:57:20 +08:00
 thautwarm

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

pattern-matching

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

大哥哥们有什么看法吗?

2247 次点击
所在节点    Python
7 条回复
guyskk0x0
2018-01-08 09:32:38 +08:00
尾递归自动展开吗?和手写展开相比性能怎么样?
WoodenRobot
2018-01-08 10:05:33 +08:00
资瓷一下~
thautwarm
2018-01-08 11:33:41 +08:00
@guyskk0x0 还很慢,只能和普通递归比。主要动态模式匹配太耗时间。我这边 tco 是和 pattern matching 绑定的,现阶段只能说让函数栈深度最大不超过 3,但是优化还不完全。。
xpresslink
2018-01-08 11:40:28 +08:00
小玩 fn 可以移情
https://github.com/kachayev/fn.py

疯玩 fn 可能失神
http://docs.hylang.org/en/stable/
thautwarm
2018-01-08 12:58:50 +08:00
@xpresslink fn.py 太丑陋了,实现也太裸。我以前和那个作者在 mailing list 有点不愉快。有些东西(特指 fp)没有语法糖支持,根本就没那个感觉。
xpresslink
2018-01-08 15:57:32 +08:00
@thautwarm
要搞 fp 还是用正统一点用 lisp 吧,学术一点 haskell, 前位一点 clojure, 混搭 scala
thautwarm
2018-01-08 16:04:34 +08:00
@xpresslink 不一定呀,也有很多人只是想日常写代码能够写得舒服。。

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/420919

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX