duangsuse::Echo
718 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
为什么数学有时候反而应该是『更适合计算机阅读』?其实是因为数学想表达的东西太宽泛也太松散了,
数学家说数学有很强的逻辑性,其实让自然语言学家来看看:的确是很明确 -- 比如,p q 是一个『对(pair)』里两个项目的名字
这很准确,但这会使得我们不知道 p, q 里哪一个是『主语』、哪一个是『宾语』,即便实际上哪个都不是也哪个都是(因为它们的关系具有对称性(symmetric)),这才是数学嘛。
编程时我们一般认为从左到右,左边的是『宾语』(操作的对象,相等判断的变量) 比如 [i++] == '\0' ,为什么我们不反着来?可是如果命名为 p q,理论是优雅了,写起来可是略微『美丽冻人』。
上面这个问题也出现在合并查找(union find)的算法里,如果引入逻辑上的传递性(a R b; b R c)而不止『数对』,就会很容易解决『没主语』的问题了,而且不会影响到逻辑的严密性。
其实不少数学问题在正常人看来都是描述『语序不当』甚至略微『成分残缺』,之所以觉得没有问题是习惯了而已,但习惯了也不能代表是最好的做法。

数学习惯的就是把一堆『特化』的东西(比如「逆命题」「简单命题」「复合命题」「分数」「小数」「无理数」「非负数」……)和没特化的大体混在一起,所以你得自己给他们归到树型,你得知道「XX命题」都是「命题」、「XX数」都是「数」…… 并且好好总结一下他们的特点和计算 -- 这不就是编程时高层抽象的多态吗?
如果只有看一个问题的能力,数学水平不容易提高,但是数学家也真是应该好好改正一下自己的说话水平了,如果不能以初学者的视角看问题,就找不到在表达上优化的方法。

计算机科学,它不像数学里,有些东西实际上是来自于数学者的『直觉』的,直觉这个东西往往很有用,但对传达知识来说,它会严重影响其他人对知识的理解(因为你「隐式」也就是「含糊」地引用了某些概念,比如什么「即得」啊「易证……」啊「只要证……」啦)。
许多数学书,比如你们的人教课本上,就会在某些问题上略过一些直白的解释,使得数学感不好的人保持半通不通只能靠做题找感觉的样子。(当然即便做了题考满分也未必代表彻底理解了)

计算机就像是什么都不会的婴儿,它很有执行能力,但完全是一片空白,所以我们不得不更加严密地处理『导入』问题(因为它和所有人一样,是有所不知的,最重要的是它比任何人都「蠢」,只会你教它的),仔细界定问题涉及到的计算、模型,这一点是许多数学问题从来不曾想的 -- 反正那一切都是数学,数学就是一堆纠缠在一起『密不可分』的模型概念。

甚至一个偏序理论,都或多或少地和几何纠缠在一起,问题得不到根本上的简化,自然对大部分人来说难以理解了。

所以计算机科学和数学对某个问题的解释,往往是数学的含糊一些,计算机科学的长不少;像是很多计算机会区分整数和浮点,而数学认为数可以是整数、分数、小数、非1自然数……,甚至是虚数)

同桌问我(一个app)为什么分苹果版和Android版,我反问他:
猫能吃鱼,狗也可以吗?所以食物得分开给。
他又问『那为什么这个(web应用)不分了呢?』,我就回答:
猫是动物,能叫;狗也是动物,也能叫,所以有时候不用分太开。

难道我要提到,Android和iOS本身「软件包『格式』不兼容」甚至「Android有libdvm.so,iOS没有」「基于JavaScript和DOM只需要他们都实现了这种(WWW)技术即可,和(原生)应用大不一样」这种技术细节?
其实我也清楚这很不准确,但我觉得对一个问题,兴趣和简明的第一印象,远比定义是否准确更重要吧。

只是说一下看法而已。 #CS #Math
我可以很轻松写 Lisp 系的解释器,也可以同样轻松地写 JSON 解析器、计算器;但是 Trie 树实在是难写啊!怎么还分四种情况?还要把叶子上岔出分叉来?

可是如果我不写 Trie 树,就没法实现自定义的二元运算符了…… 因为没有线索树的话,扫描 a+b 这种就不知道该何时分 a,b 这些名字和加号了 emmmm 😂

我不敢用别人的实现,我觉得他们实现得肯定更复杂更难看,我只需要一个简单、递归的 API 就够了……

还以为能够写出带启发式合并的 Radix 树的
RangeMap 什么的也很绕啊…… 不过不像 Trie 树的泛型那么烧脑
trie.zip
2.1 MB
已经失败了,初试不利。
看来只能量力而行,我打算这周暂时不写 Trie,更不可能写 Radix 树了,先做点力所能及的工作吧。

但是,其实也是有好的地方的,因为我的 Feeder 写的可以说是史无前例的简单、不强耦合,简单到我都觉得有点不正常,但它就是 works
至于 Trie 的泛型和建支问题,我相信以后会有改进。
已经累死(这是今天上午
这居然是 duangsuse 写 JSON 解析器的方法??!
自从用上 Java 后,我写算法的能力越发降下了;本来我还想 peek 一下 BST(binary search tree) 的 mid 然后判 GT LT EQ 再二分找的 (GT -> first(LE); LT -> last(LE)),JDK NavigableSet<E> 都直接弄好了……
duangsuse::Echo
自从用上 Java 后,我写算法的能力越发降下了;本来我还想 peek 一下 BST(binary search tree) 的 mid 然后判 GT LT EQ 再二分找的 (GT -> first(LE); LT -> last(LE)),JDK NavigableSet<E> 都直接弄好了……
有了 RangeMap,可以实现光标下的符号高亮解析这样的功能,当然没有的话就几乎很难实现了,太慢

虽然只能在 JDK 上用……(Kolin 好像没 sorted sets?)
完全迷了
比较 freestyle (迫真
Forwarded from dnaugsuz
如果用我之前设计的绝句来说,可以这么写(只是说可以,不是说推荐),比较一下:

事 f(数、实): 元二<实、浮> {} 
数据物 S(x: 字、y: 数、z: 实): 存储
常S s = S()
对你s,元三(x、y、z)。里的,它置为1
你s,元三(y、z、x)。批量置为(元三(3、3.2、'x')) — 肯定不是标准库里的
f(*你s,元二(y、z)。)
f(*你s,元二(y、y)。)

……简直写不下去
不过『存储』这个特性蛮高级的,我还没设计好emmm……

https://t.me/dsuse/11777
这是一些随记,还很不成熟,我最近是没时间实现的,不过我在写一个解析组合子框架(ParserKt,已经拿它写了一个JSON解析器尚待修完……)
Forwarded from dnaugsuz
简而言之,如果把这些代码翻译到绝句可以用这些特性:

事 Name(x: T0, y: T1): R 为……
当然后面的缩进块是可选的,也可以用 {}

元一<T1> 元二<T1, T2> 元三<T1, T2, T3>…… 元组类型
之所以不说是『一元』『二元』,是因为数字可以这么表达:二十三+二十万二千一百

你,……。
这种『第二人称文法』
当然它和 let 是有区别的,区别在于有 (你a且大b、c) (你x在a且不在b) 这种语法糖

所以C-forall的所有 x.[a, b] 在有存储抽象的绝句上其实都是 你x,元二(a, b)。的形式,我搞不懂的就是何时编译器要选择存储、何时要选择值,打算加入多态特性的。(类型推导麻烦一些)

Name(*Expr)事 …(变长 Name: Type)… 就是变长参数传递了,所有支持 算符的事 项目n 的都可以这么照 *

字(Char)、数(Int)、浮(Float)、实(Double)、效果(Unit) 这些
「数据物」,还有基于『分配』(而不是『值』)的「物」
因为我实在不想引入 struct 之类的东西,我觉得它使得语言的数据类型被过分分割了,写起来莫名其妙,继承自分配是等价用 struct

不过没有东西等价 struct 的,因为「struct」必须有架构器…… 就是说 数据物 Name(…): 分配 了……

最后的
v.[x, y.[i, j], z.k]
就是(好像很难看了呢,因为逗号简记法不能写在一行里……)
你v,
元三(x、你y,
元二(i、j)
z的k)

最后的 f().[2, 1] 就是
你f(),元二(我[2]、我[1])。

说白了就是在翻译 Kotlin……
Forwarded from dnaugsuz
也的确是,不过如果要在类型级别是不是很困难?因为时间可能和输入相关
Forwarded from dnaugsuz
这方面最典型的例子就是停机问题
halting p = if p then infinity else 1
where
infinity = drop Infinity ones
ones = 1 : ones
这种情况就是 True -> (没有值); False -> Int
当然计算机科学的研究者们是不肯把程序写成这样的,不过还是可以有 Y 组合子……

Y = \f. (\c. f (c c)) (\c. f (c c))
Forwarded from dnaugsuz
Tcl/tk 嘛(读 tickle)
我觉得它和 Squirrel 一样,没点文档
Forwarded from dnaugsuz
我讨厌文档不好的语言;Lua 可是一个类似但文档很好的语言
Forwarded from dnaugsuz
所以说我其实是一个倾向工程派的人,因为我简直无法忍受学术系 Haskell 的风格,都快无法结合那一堆 phi psi mu (>>=) ($) 了……

但我一点都不觉得函数式能够解决更多问题,实际上我只是喜欢混合函数式编程的风格,和纯函数控制那一套无关