Forwarded from dnaugsuz
型变是
协变,
逆变,
(其中
子类型即若有
型变性的意义主要是,定义出符合子类型限制的类型约束,比如 PECS(producer-extends; consumer-super) 原则。
假设你的函数需要接受上一为参数
参数列表多几项、少几项都是一样的,只是要满足必须的类型约束而已。
实践上,就是每个 Producer/Consumer/Function<T, R> 的是用处都必须以
Kotlin 有 in/out 的声明处型变,也就是不用 Java 的 "Type wildcard" 了,是符合理论优雅性和实践便利性的:
在类型约束(如函参)处,
类型(限)上/下界即是指
🖕这个玩意非常易混,涉及一些中英文的文化差异和数学抽象概念的移植,建议不要使用
另外,泛型(generics, aka. parameterized polymorphism 参数化多态) 不是范型、上下界(U/Low bound) 不是上下届 ,千万别拼错。
<T> 参数上面的一种性质,其定义为:协变,
P<T1>: P<T> 逆变,
P<T>: P<T1>
不变, P<T>, P<T1> 无子类型关系。(其中
T1: T 、 class P<T> )子类型即若有
T1: T ,或言 (T)(T1)obj 有效(checks),则 op((T)x) 对 op((T1)x) 照样可用。型变性的意义主要是,定义出符合子类型限制的类型约束,比如 PECS(producer-extends; consumer-super) 原则。
interface Producer<R> { R get(); }
interface Consumer<T> { void accept(T value); } 假设你的函数需要接受上一为参数
er,它必须这样定义才能尽可能兼容「真正能兼容的所有」 er:void <R> R recv(Producer<? extends R> er);
void <T> void send(Consumer<? super T> er, T value); 参数列表多几项、少几项都是一样的,只是要满足必须的类型约束而已。
实践上,就是每个 Producer/Consumer/Function<T, R> 的是用处都必须以
Function<?super T, ?extends R> 这样的方法去定义参数的类型约束,不然它会破坏子类型的类型安全、或使本该有效的程序报类型检查错误,但让程序员去写这些 extends/super 的,实际上这是在暴露与业务逻辑不相干的细节。Kotlin 有 in/out 的声明处型变,也就是不用 Java 的 "Type wildcard" 了,是符合理论优雅性和实践便利性的:
interface Function<in T, out R> { fun apply(value: T): R } 在类型约束(如函参)处,
Function<Int, Any> 自动兼容其 Function<Number, Unit/*或 Nothing? = java.lang.Void, 仅 null*/> 类型(限)上/下界即是指
Void...Object (子类型的)extends/super 的约束,Void 是底,没有实例的类型;Object 是顶,所有类型的父类型,这个东西没有区间只能加限制条件。🖕这个玩意非常易混,涉及一些中英文的文化差异和数学抽象概念的移植,建议不要使用
另外,泛型(generics, aka. parameterized polymorphism 参数化多态) 不是范型、上下界(U/Low bound) 不是上下届 ,千万别拼错。
Oracle
Upper Bounded Wildcards (The Java™ Tutorials >
Learning the Java Language > Generics (Updated))
Learning the Java Language > Generics (Updated))
This beginner Java tutorial describes fundamentals of programming in the Java programming language
Forwarded from dnaugsuz
我字多是因为我明白,想的多一点可以让代码简洁好看点
拿一小篇文字换所有项目里几十文件的质量,值。
拿一小篇文字换所有项目里几十文件的质量,值。
Forwarded from dnaugsuz
有的代码写一行省十行,有的代码所遵循的模式,写了第一行后维护和重读重理解的麻烦不断;即便功能相同,不同的人写出来质量是完全不一样的。
所以我一贯很乐意学习编程之道,可能你觉得我字多些,对真的要学这些内容的人来说,这是我第五次讲相同话题,已经很省字数了。
便宜的就是最贵的,不想付出但想多得回报,很难不为这种心态再付出更大的代价。浪费与节省,大概是这个道理。
所以我一贯很乐意学习编程之道,可能你觉得我字多些,对真的要学这些内容的人来说,这是我第五次讲相同话题,已经很省字数了。
便宜的就是最贵的,不想付出但想多得回报,很难不为这种心态再付出更大的代价。浪费与节省,大概是这个道理。
Forwarded from dnaugsuz
一般对解释(interpret)、编译(compile) 这些的理解是
解析(String到语法树 数据结构)->预处理(脱糖什么的)->类型检查(type check)-> 执行(execute)-解释/代码生成(codegen)-编译
这样吧,没有解释器去编译一说, Java 虚拟机的确不认 T 这些参数,只是 Object 化了而已,字节码只存反射用元数据。
解析(String到语法树 数据结构)->预处理(脱糖什么的)->类型检查(type check)-> 执行(execute)-解释/代码生成(codegen)-编译
这样吧,没有解释器去编译一说, Java 虚拟机的确不认 T 这些参数,只是 Object 化了而已,字节码只存反射用元数据。
#algorithm (感觉自己转发的可能有点奇怪了 🤔)
#cplusplus
不过代码质量真的可以🍎(注: name shadowing 有点不好,我习惯的是同层次相关可以同名...),反观引的等价算法1千行就……
尾调用版亦可写
#cplusplus
std::vector<bitset<N>> rec;
int gcd(int x, int y); void dfs(int o=0, int lst=0); 不过代码质量真的可以🍎(注: name shadowing 有点不好,我习惯的是同层次相关可以同名...),反观引的等价算法1千行就……
gcd(x,y) { while (x %= y/*x取商 若有余数*/) std::swap(x, y); return y; } 这个求公约写法够简洁了 🌝尾调用版亦可写
gcd(x,y) = if (x%y==0) y else gcd(y, x/y)Forwarded from mivik::channels::tech
#gist #string #combinatorics_of_strings #project
计算所有长度为 n 的字符串的自相关位向量(Autocorrelation)
https://gist.github.com/Mivik/6e0459afe6691bce2659e1eaa5141390
没有注释的话只有短短 60 行,并且没有刻意压行,比 某些人 写的 1000 多行版本好多了(写那个的貌似是个学院派,代码里充斥着完全没法编译的怪异头文件以及鬼畜的码风...)
灵感来自于 这篇论文
计算所有长度为 n 的字符串的自相关位向量(Autocorrelation)
https://gist.github.com/Mivik/6e0459afe6691bce2659e1eaa5141390
没有注释的话只有短短 60 行,并且没有刻意压行,比 某些人 写的 1000 多行版本好多了(写那个的貌似是个学院派,代码里充斥着完全没法编译的怪异头文件以及鬼畜的码风...)
灵感来自于 这篇论文
Gist
Enumeration of autocorrelations of length n
Enumeration of autocorrelations of length n. GitHub Gist: instantly share code, notes, and snippets.
duangsuse::Echo
作为开发者,你对「学院派」持什么态度?
#zhihu #plt #china 🤔别看了
[王垠,请别再欺负我们读书少 - 开发者头条](https://toutiao.io/posts/33acp5/preview)
[PLT零基础的人,要看懂王垠和彭飞在《王垠,请别再欺负我们读书少》里讨论的内容,需要掌握哪些知识? - 知乎](https://www.zhihu.com/question/42315543)
[如何评价王垠的新文章《回应CFA传人对我的攻击》? - 知乎](https://www.zhihu.com/question/42333233)
[王垠,请别再欺负我们读书少 - 开发者头条](https://toutiao.io/posts/33acp5/preview)
[PLT零基础的人,要看懂王垠和彭飞在《王垠,请别再欺负我们读书少》里讨论的内容,需要掌握哪些知识? - 知乎](https://www.zhihu.com/question/42315543)
[如何评价王垠的新文章《回应CFA传人对我的攻击》? - 知乎](https://www.zhihu.com/question/42333233)
toutiao.io
王垠,请别再欺负我们读书少 - 开发者头条
开发者头条,程序员分享平台。toutiao.io
duangsuse::Echo
#Python #code 妈耶,看来还是 lambda op_append: 的方法好,虽然带副作用。 总结:新写法省了 gavSplit 和 from itertools import chain ,多了 3*lambda ,优雅性持平。
新写法加了仨 trivial(可省) def ,总觉得不该以行数为全部的... 总行数18 -3 -1(proj 的 for in) = 14 ,最小了吗 🤪
可这个程序以
可这个程序以
a:b:c org.h:a,-w,--w1:1.0 示例输入生成了 35 行输出, 14/35==0.4
duangsuse::Echo
https://github.com/CASC-Lang/CASC 我会一如往常在频道里进行项目结构分析,然后用与 C# 相对的 Java (竟然不是 Kotlin... )进行一些并行的重写工作。 之所以用 #Java 写这样富于技巧的 #CE 编译器 程序,是因为我想常常新口味了…… 一些原来 Kotlin 里有的我也用 TypeScript 重写过 原项目是一个“能编译繁简体中文、甚至英语”的编译器,目标是对简体程序员可用。 ChAoS_UnItY (Chaos Unity) 开发,由 C# minisk…
md.py
594 B
#Python #code 😭 暂时没有找到 Markdown export 的 bot ,就只好基于 @ShowUpdateJsonBot 这个全文 BotUpdate Event JSON dump 机器人,转换下 span
参见依云大佬的 snippet (不对... 这个还带 line_number 的)
参见依云大佬的 snippet (不对... 这个还带 line_number 的)
def applySpans(d, op, coding="utf-8"):这个 range 可以表示成 (pos+length) (iBeg,iEnd) (iBeg,iStop) 很多种方法,其实还是第一种最常见
bs = d["text"]; i0 = 0
addSpan = lambda e: (e["offset"], e["length"], e)
for (i, n, e) in map(addSpan, d["entities"]):
iStop = i+n
yield bs[i0:i]
yield op(e["type"], e.get("url"), bs[i:iStop])
i0 = iStop
def mdify(type, data, text, fmts={"text_link": "[{0}]({1})","hashtag":"{0}"}):
return fmts[type].format(text, data)
#Python #tools #Telegram 这下就有经验了,不会倒大霉!
def join(op): return lambda *args: "".join(op(*args))结果:
@join
def applySpans(d, op, kP="offset", kN="length"):
s = d["text"]; i0 = 0
span = lambda e: (e[kP], e[kP]+e[kN], e)
for (iBeg, iStop, e) in map(span, d["entities"]):
yield s[i0:iBeg]; yield op(e["type"], e.get("url"), s[iBeg:iStop])
i0 = iStop
def transTable(deft="{0}", **d): return lambda tag, data, text: (d.get(tag) or deft).format(text, data)
from json import loads; from sys import stdin
def readJson(): s=stdin.read(); return loads(s[s.index('{'):])
print(applySpans(readJson(), transTable(text_link="[{0}]({1})", code="```{0}```")) )
这个没啥,相关知识: 算符链 [InfixPattern](https://github.com/ParserKt/ParserKt/blob/master/src/commonMain/kotlin/org/parserkt/pat/complex/InfixPattern.kt)/«Lua设计与实现» 相关章节; 中文数值 [NumUnit](https://github.com/ParserKt/ParserKt/blob/37599098dc9aafef7b509536e6d17ceca370d6cf/parserkt-ext/src/commonMain/kotlin/org/parserkt/pat/ext/NumUnitPattern.kt)/[han()](https://github.com/duangsuse-valid-projects/Share/blob/master/Others/CN_constitution.md) #learnGist
Reformat Telegram @ShowUpdateJsonBot Message update json to markdown
Reformat Telegram @ShowUpdateJsonBot Message update json to markdown - tg_md.py
不 excited ,非常不 excited 。
本来是不打算弄这个的,现在弄了,发现效率不知为什么变得很低,大概就是想择机写点小工具而已
可是这个重构真的会很麻烦吧,说好了要休息的
本来是不打算弄这个的,现在弄了,发现效率不知为什么变得很低,大概就是想择机写点小工具而已
可是这个重构真的会很麻烦吧,说好了要休息的
#Python 草生了.... 什么时候能不要挂羊头卖狗肉了,搞得我很怀疑自己能力啊,连个重写都做不到?那么简单的分词器都不会?!
python mvng.py a:b:c org.h:a,-w,--w1:1.0 -dependencyManagement org.junit:--bom,:5.7.0 -plug :wtf -parent org.my:base -module hello -fat -xi 0 -x 'parent=text:a:v' -x '.=eval:listE("contributor",opOnEach(opSetsChild("name"),["a"]) )'GitHub
duangsuse/CASC-Java
A handwritten compiler which can transform English or Manderin, even mixed codes! - duangsuse/CASC-Java