liulyllyのblog
2024-06-01 01:17:20

一份 monad cheat sheet.

以前在别人的一篇 blog 里看到过有这样一句话,大意是:关于 monad,几乎每个在学习函数式编程中接触到这个模式的,都会写一篇博客描述他的理解。而且不同的人对 monad 的理解有所不同(暗讽 monad 的复杂)。

所以咱也来写一份!尽管 monad(单子)是一个来源于范畴论的概念(在范畴论中它被定义为「自函子范畴上的幺半群」),若没有接触过范畴论可能会觉得这份定义很难理解,然而在实际编程中,我们只需要数行代码就可以构造出「幺半群」、「函子」和「单子」。

本文将首先用 TypeScript 构造出「幺半群」、「函子」和「单子」及相关示例,然后再(尝试)解释这些概念。因为我们只需要在「程序语言的类型」这一具体语境下使用范畴论的一些概念,所以这里的「范畴论知识」也某种程度上被特化了,我们不会涉及到范畴论中的全部抽象。

查看更多
2024-05-18 00:25:40

整理自前段时间做的一个技术分享。还是承接两个月前我写的打包体积优化的文章,最后留了一个小坑:

ESM 时期这类项目应该是有机会有后续进展的,因为对 ESM 模块而言,静态的导入导出声明使得可以更简单的获取到模块的精确调用模型。值得期待。

其实这里说的不太准确,ESM 的好处主要是限制了顶层变量的作用域,再配合模块导入导出声明才能达到追踪变量使用的效果。总之后面自己尝试填了一点这方面的坑,给 Rollup 提的 PR 也是在干这件事,这个链接里有 Rollup 的 maintainer(@lukastaegert)整理的这个 PR 的作用和合并过程(其实还挺折磨的,因为一开始没太看懂 Rollup 的算法思想)。

所以本篇文章补一下这个 PR 实现背后的部分理论基础,主要是部分求值,和在 JavaScript 打包体积优化的应用。关于 Tree-Shaking 算法细节,和算法中比较重要的,变量的状态的格(代数结构里的格)表示,可能会另开一篇(写在毕设里了,不过未必会整理到博客上),也可能咕咕咕(

查看更多
2024-04-29 00:46:27

一篇杂谈文章。在四月份末写大四总结似乎是一件很奇怪的事情(是否也是一种五月病),但过去一年的经历实在让我产生了太多梦幻的感觉,有些害怕这些感觉就这么溜走:我并没有拍照记录生活的习惯,偶尔回看为数不多的照片也常常忘记了当时的思绪。所以我决定 push 自己写下这篇文章。(虽然已经有很多想法不记得了,本文写作过程中一直在翻自己的 Twitter 和 Telegram)

大概是一些关于实习、毕业设计、科研和未来生活的碎碎念。

查看更多
2024-03-13 17:33:33

接上篇文章,我们在实现了 APlayer 的 Tree-Shaking 之后,遇到了一个新的问题:我们成功为播放器的某些功能拆分出了对应的插件,通过 APlayer.use(plugin) 的方式进行加载。但是有的插件会为 APlayer 注入新的方法,我们希望在加载插件后能够正确的提示出这些方法;并且在不加载插件的时候,不会提示出这些方法。即,use 操作需要返回一个新的 APlayer 类型,这个类型包含了插件注入的方法。

本文先介绍一下这个功能的实现,然后再讨论一下 TypeScript 中的 unknown, never, void 和 any 等特殊类型。

参考:

查看更多
2024-03-05 19:23:50

这段时间在改进自己的博客,做了很多有意思的事情(PWA,SSG,打包体积优化等等),写一篇记录一下最近的一次打包体积优化的过程。

一般来说,打包体积优化无非就是合并小文件、减少依赖项;压缩代码和移除无用代码等可以由打包工具完成。但有的时候依赖本身就很大,比如博客右边的那个音乐播放器 APlayer,以 APlayer.min.js 的单文件形式分发,体积就有 57.9KB。整合到博客的 Vue 组件后,经过 Rollup 再次打包为 58.2KB。这时候就需要自己动手了。这里的情况是 APlayer 已经很久没有更新了,所以可以考虑自己修改源码。最后优化到了 30.8 KB。

完工后的结果在 这个仓库。

查看更多
2024-02-26 19:59:23

这篇文章记录下对博客进行的 PWA(Progressive-Web-App)改造!因为博客是基于 Vite 的,所以理论上来说安装配置一下 VitePWA 就 ok 了。

PWA

PWA 这个词听上去可能很让人陌生,但在国内我们早就熟悉一个很类似的概念了——小程序。

查看更多
2024-02-23 22:43:15

想做 Anime List 很久了,之前也考虑过 Notion 的方案,但是本人平常也不用 Notion,不想为了这个事情多用一个平台。最近发现自己使用的 bangumi 有 API,于是就想到了用它来做 Anime List。

查看更多
2023-10-20 13:18:59

发现自己很久没更过博客了,也确实有点不知道该写什么,于是来水一篇最近的第三届北京大学信息安全综合能力竞赛(PKU GeekGame)部分题解了。工作摸鱼打了一周,最后总排名 15。

查看更多
2023-03-03 21:47:31

大学前我一向是有些讨厌写游记的,现在想来那时写的游记往往都是「作业性质」,被迫应付每周的作文任务。往往这类游记还得编出一个中心思想,例如工业游需要编一个「以后好好学习报效祖国」,文化游要编一个「从古人身上,我领悟到了什么精神」,诸如此类。那时的旅游常常也不是完全出于自己的意愿:虽然不能说是被迫的,但总归还是被家长,学校安排的,我个人还是比较喜欢宅在家(从小就开始宅了)。

上了大学后,自己的自由时间一下子多了起来。正值早春时节,加上基本考完了延期到本学期初的期末考试(虽然还有一门,但是在两天之后),于是临时给自己拟定了一个「爬大蜀山」的计划,并以这篇「不需要中心思想的游记」简单记录我的忙里偷闲。

查看更多