#Math #music
最近知道了两个之前不知道的芝士: 🤔
+ 音高是什么!
+ x 的 (n 的倒数次方)等于开 x 的 n 次方根
where
n 的倒数: 1 / n
x 的 k 次方: x {* x} repeats for (k-1) times
n 的 k 次方根: (x 的 k 次方 = n) => x
+ 数学函数和数学操作符是不一样的
最近知道了两个之前不知道的芝士: 🤔
+ 音高是什么!
+ x 的 (n 的倒数次方)等于开 x 的 n 次方根
where
n 的倒数: 1 / n
x 的 k 次方: x {* x} repeats for (k-1) times
n 的 k 次方根: (x 的 k 次方 = n) => x
+ 数学函数和数学操作符是不一样的
Telegram
duangsuse::Echo
咳咳,我记得上一段时间的确发了一个说“暂停学习”的广播来着,现在找不到了...(可能是,我的确停止学习了很久吧)
这两周才开始继续看起来一些东西,
《Rustonomicon》(我当时打印的是英文版,这本书是写 Rust 程序设计语言实现底层一点的算法结构库的、也提到了不少 Rust 的细节,和任何『安全』系统编程,虽然这里主要是数据结构,需要考虑的东西,比如异常安全和指针别名、零长类型、原子性和并发安全、OS/Hardware 的实现细节什么的)
《Kotlin 极简教程》(书写的这么好,我很后悔…
这两周才开始继续看起来一些东西,
《Rustonomicon》(我当时打印的是英文版,这本书是写 Rust 程序设计语言实现底层一点的算法结构库的、也提到了不少 Rust 的细节,和任何『安全』系统编程,虽然这里主要是数据结构,需要考虑的东西,比如异常安全和指针别名、零长类型、原子性和并发安全、OS/Hardware 的实现细节什么的)
《Kotlin 极简教程》(书写的这么好,我很后悔…
duangsuse::Echo
#Math #music 最近知道了两个之前不知道的芝士: 🤔 + 音高是什么! + x 的 (n 的倒数次方)等于开 x 的 n 次方根 where n 的倒数: 1 / n x 的 k 次方: x {* x} repeats for (k-1) times n 的 k 次方根: (x 的 k 次方 = n) => x + 数学函数和数学操作符是不一样的
#tech #daily #Java #JavaScript #dev
🐱 duangsuse 的学习日常 ⭐️
+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs
+ 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容)
+ 高性能计算::C 语言和高性能计算、x86 汇编和 SIMD(单指令多数据)运算、JNI 外置原生算法
+ 软件架构::FFMpeg av* 库水印程序
+ 数据库::关系代数 #db
+ {Android, 数据结构和算法}::Android 的离散数组 SparseArray 和 ArrayMap #algorithm
+ 数据结构和算法::这些算法和数据结构,忘记了吗?
+ Rust/数据结构和算法::Rust 的 Vector 实现
+ Rust::Hole 类型、snappy 绑定、Tree 类型、LinkedList、Box、Rc、std::thread 等
+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写一个 Android 上的 Service!(感谢 @YuutaW 提供学习资源,ShutdownService 默写)
+ 软件项目管理::Gradle 的抽象总结
+ JavaScript ES6: sm.ms.js
+ JavaScript ES6: 基于 CheerIO 和 Requests.js-promise-native 的爬虫,默写(感谢 @ice1000 的原实现,这可能是冰封哥有史以来最奇怪的代码,因为他写了两个完全可以被替换为更有意义结构的没有用的控制结构...)
+ JavaScript ES6: ArrayBuffer, DataView 读 BMP、再看 ASCII 艺术画生成
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ Kotlin::Shell execute
+ Kotlin::Coroutine
+ Kotlin::Kotlin Native 和 Kotlin JavaScript 与 Gradle/Groovy
+ Kotlin HTML DSL
+ Kotlin 内部代理类 (Delegates)
+ Kotlin OkHttp 同步/异步封装
+ C 程序设计语言::libBMP 和 libWAV
+ C 程序设计语言::OpenGL 体验
+ 无脑模式::线性代数::高斯·约当消元法(Gauss Jordan)解齐次线性方程组(Homogenuous Linear Equation Group)
+ 无脑模式::C++/Qt::拼音分词、英文音标转换和 TTS 合成
+ 无脑模式::Haskell 抄写 Haskell 的 AlgorithmW Hindley-Milner Type system type infer algorithm 实现
+ Javax Servlet 架构体验 🤔
🐱 duangsuse 的学习日常 ⭐️
+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs
+ 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容)
+ 高性能计算::C 语言和高性能计算、x86 汇编和 SIMD(单指令多数据)运算、JNI 外置原生算法
+ 软件架构::FFMpeg av* 库水印程序
+ 数据库::关系代数 #db
+ {Android, 数据结构和算法}::Android 的离散数组 SparseArray 和 ArrayMap #algorithm
+ 数据结构和算法::这些算法和数据结构,忘记了吗?
+ Rust/数据结构和算法::Rust 的 Vector 实现
+ Rust::Hole 类型、snappy 绑定、Tree 类型、LinkedList、Box、Rc、std::thread 等
+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写一个 Android 上的 Service!(感谢 @YuutaW 提供学习资源,ShutdownService 默写)
+ 软件项目管理::Gradle 的抽象总结
+ JavaScript ES6: sm.ms.js
+ JavaScript ES6: 基于 CheerIO 和 Requests.js-promise-native 的爬虫,默写(感谢 @ice1000 的原实现,这可能是冰封哥有史以来最奇怪的代码,因为他写了两个完全可以被替换为更有意义结构的没有用的控制结构...)
+ JavaScript ES6: ArrayBuffer, DataView 读 BMP、再看 ASCII 艺术画生成
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ Kotlin::Shell execute
+ Kotlin::Coroutine
+ Kotlin::Kotlin Native 和 Kotlin JavaScript 与 Gradle/Groovy
+ Kotlin HTML DSL
+ Kotlin 内部代理类 (Delegates)
+ Kotlin OkHttp 同步/异步封装
+ C 程序设计语言::libBMP 和 libWAV
+ C 程序设计语言::OpenGL 体验
+ 无脑模式::线性代数::高斯·约当消元法(Gauss Jordan)解齐次线性方程组(Homogenuous Linear Equation Group)
+ 无脑模式::C++/Qt::拼音分词、英文音标转换和 TTS 合成
+ 无脑模式::Haskell 抄写 Haskell 的 AlgorithmW Hindley-Milner Type system type infer algorithm 实现
+ Javax Servlet 架构体验 🤔
duangsuse::Echo
#tech #daily #Java #JavaScript #dev 🐱 duangsuse 的学习日常 ⭐️ + 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs + 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容) + 高性能计算::C 语言和高性能计算、x86…
https://raw.githubusercontent.com/yairchu/Algorithm-W-Step-By-Step/master/AlgorithmW.lhs
现在就可以试用 Haskell 编写的 Type inferer,可惜我还要再抄一遍(🙈
现在就可以试用 Haskell 编写的 Type inferer,可惜我还要再抄一遍(🙈
AlgorithmW.tex: Algorithm.lhs
lhs2Tex $< > $@
AlgorithmW.pdf: AlgorithmW.tex
latex $<
pdflatex $<
AlgorithmW: Algotithm.lhs
ghc --make $<
https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.htmlwww.gnu.org
Automatic Variables (GNU make)
Next: How Patterns Match, Previous: Pattern Rule Examples, Up: Defining and Redefining Pattern Rules [Contents][Index]
#Haskell 开心。
ghc -e main AlgorithmW.lhsForwarded from dnaugsuz
个人觉得,还是写 SQL 规范一些,MongoDB 有 Java 的 stream EDSL
比如
比如
MongoClient.<init>(String host, int port)然后可能要这么操作:
MongoClient#getDatabase(String name)
MongoDatabase#createCollection(String name)
MongoDatabase#getCollection(String name)
MongoCollection<>#createIndex(Index, IndexOptions)
Index.<init>(String key, Order)
IndexOptions#unique(boolean)
MongoCollection#find()比如
#sort()
#filter
#limit()
#into()
users.find(eq(User.K_ID, "duangsuse"))
但是觉得要优化的话,MongoDB 更高层一些呢,但是 SQL 会规范很多Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (Yuuta | a.k.a. 鱼塔 🐟)
卒。
选错了 VHD,把 Root VHD 当 Child 选了,然后手残 Bootice 点了压缩。
卒,开机就重启。看来只能用 Root 了
选错了 VHD,把 Root VHD 当 Child 选了,然后手残 Bootice 点了压缩。
卒,开机就重启。看来只能用 Root 了
#Java https://javaranch.com/journal/2002/01/jlsjan2002.html
你可能不知道的 Java 语法 "Qualified class instance creation":最好的解释...
你可能不知道的 Java 语法 "Qualified class instance creation":最好的解释...
duangsuse::Echo
#Java https://javaranch.com/journal/2002/01/jlsjan2002.html 你可能不知道的 Java 语法 "Qualified class instance creation":最好的解释...
上 DuckDuckGo 居然没几个人、没几个教程知道还有这种语法... 可谓冷门了...
duangsuse::Echo
上 DuckDuckGo 居然没几个人、没几个教程知道还有这种语法... 可谓冷门了...
我也无法快速理解了,只能到时候看编译器源码吧(
最近 CSS 和 JavaScript 都宣布了一个管道操作符,还不能使用。尽管反复看,前一个只记得住使用范围(<table>)… 后一个只记得住作用(简化连锁函数调用)… 真是要多用才能理解,才能记住。
duangsuse::Echo
最近 CSS 和 JavaScript 都宣布了一个管道操作符,还不能使用。尽管反复看,前一个只记得住使用范围(<table>)… 后一个只记得住作用(简化连锁函数调用)… 真是要多用才能理解,才能记住。
不过,这个 Qualified class instance creation 可不是新的 Java Feature 了(至少是 Java 1.2 就有),新的是
var local variable type inference (Java 10+),Java 以前一直是显式类型的语言呢,现在终于有了 Type inference。
duangsuse::Echo
#tech #daily #Java #JavaScript #dev 🐱 duangsuse 的学习日常 ⭐️ + 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs + 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容) + 高性能计算::C 语言和高性能计算、x86…
如你们所见,很多,所以一天是无法完成的,所以这个列表慢慢累积...
先默写一下 Java 和 Kotlin 的 Modifiers
== Java
Class members
Classes
先默写一下 Java 和 Kotlin 的 Modifiers
== Java
Class members
abstract final static strictfp volatile stransientProcedural
native synchronized== Kotlin
Classes
abstract open finalClass members
enum annotation data sealed
abstract open final override lateinitProcedural
const
suspend infix operator inline external tailrec
Access controlpublic private protected interal
Parametersvararg crossinline noinline
Parameterized Type Variancein out
Type Parametersreified#Java #Kotlin https://gist.github.com/duangsuse/dfc532a16f547459bcf3f4f8d922d849 更新了一个字
https://gist.github.com/duangsuse/dfc532a16f547459bcf3f4f8d922d849/revisions
Void 改成了 Nothing
其实 Unit 也可以,反正 Void 类型只有一种可能的值:null
Nothing? 和 Unit 也都是一样(被 Rust 称为 Zero Size Types,因为他们在值的层面讨论只有一种可能性:Unit 就是 object Unit、Nothing? 就是 null、Void 也是 null),而 Nothing 类型没有可能的值(Empty Type/Bottom Type,这个名字是来源与它在子类型层次结构里处于最底端的缘故)
https://gist.github.com/duangsuse/dfc532a16f547459bcf3f4f8d922d849/revisions
Void 改成了 Nothing
其实 Unit 也可以,反正 Void 类型只有一种可能的值:null
Nothing? 和 Unit 也都是一样(被 Rust 称为 Zero Size Types,因为他们在值的层面讨论只有一种可能性:Unit 就是 object Unit、Nothing? 就是 null、Void 也是 null),而 Nothing 类型没有可能的值(Empty Type/Bottom Type,这个名字是来源与它在子类型层次结构里处于最底端的缘故)
val empty: Nothing? = null
虽然 Nothing? 的语义很正常,但是 unsupported [Array<Nothing> in return type is illegal]
...Gist
Essay: Android cancellable asynchronous task API abstractoin in Kotlin
Essay: Android cancellable asynchronous task API abstractoin in Kotlin - Essay-Android-AsynchronousTaskAbstractoin.kt
duangsuse::Echo
#tech #daily #Java #JavaScript #dev 🐱 duangsuse 的学习日常 ⭐️ + 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs + 程序设计语言类型::这些名词,你知道吗?(涉及 Parameteric Polymorphism 和 Empty Types(aka. Bottom types)、Product types、Subtyping 等内容) + 高性能计算::C 语言和高性能计算、x86…
这次就有一些我最想先弄的东西:
+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs
+ 程序设计语言类型::常见名词
+ 数据库::关系代数 #db
+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写 Android ShutdownService
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ JavaScript ES6: sm.ms.js
+ Kotlin::Shell execute
+ Kotlin OkHttp 同步/异步封装
+ 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs
+ 程序设计语言类型::常见名词
+ 数据库::关系代数 #db
+ Java 的二进制流读写器 #bin
+ Java 的 Android android.content.SharedPreferences 代理库 Prefer
+ {软件架构, Android}::编写 Android ShutdownService
+ Kotlin::简单的 Realm ORM + RecyclerView Android 应用
+ JavaScript ES6: sm.ms.js
+ Kotlin::Shell execute
+ Kotlin OkHttp 同步/异步封装
#security https://t.me/dsuses/2956 🤔 说起来我之前一直丢脸地不知道加盐是什么原理... 嘛其实也未必,我知道 hash 算法、局部敏感的 hash 算法、HashMap、SHA 算法,可是之前知道的没有这么详细
比如说,对我的名字计算 sha256 值:
不过也可以这样,允许用户设置一个『盐』值,我们把这些信息以一种我们自己知道可以重复(幂等)的方式混淆到原数据上面,作为一种预处理:
一般直接用 concat 就可以了
比如说,对我的名字计算 sha256 值:
import java.security.*
val sha256 = MessageDigest.getInstance("SHA-256")
sha256.reset()// fold Left
sha256.update(("duangsuse" as? java.lang.String)?.getBytes())
fun <T : Number> Iterable<T>.hexDigest(): String = this.fold(StringBuilder()) { acc, it -> acc.append(String.format("%02x", it)) }.toString()
fun <T : Number> Array<T>?.hexDigest(): String? = this?.toList()?.hexDigest()
fun ByteArray?.hexDigest(): String? = this?.asList()?.hexDigest()
fun MessageDigest.mkHash(bs: ByteArray): ByteArray = this.run { reset() }.run { update(bs); digest() }
val String.bytes: ByteArray? get() = (this as? java.lang.String)?.getBytes()
val name_shasum = "duangsuse".bytes?.let { sha256.mkHash(it) }.hexDigest()
但是如果 cracker 有一个 hash 字典,然后它知道我名字的 hash 值是 e3b0c44...
我就傻冒了,我的身份将被冒充,并且他这个肮脏侥幸的数学破坏者会弄到我的明文密码 😭不过也可以这样,允许用户设置一个『盐』值,我们把这些信息以一种我们自己知道可以重复(幂等)的方式混淆到原数据上面,作为一种预处理:
一般直接用 concat 就可以了
inline fun String.salted() = System.getProperty("salt", "") + this
只要每次计算 hash 的时候都先按照可重复的方法预处理,就可以增强 hash 的保密效果,不那么容易碰撞了,也可以进行同样的身份验证。Telegram
duangsues.is_a? SaltedFish
为了防止撞库攻击,很多人都建议任何密码相同(或相关)的用户修改自己的密码。
~想法~
所以,改成什么?
1.自己要能记忆
2.不同网站/程序不一样
3.不同密码之间无关连
思考了一下
希望:“即使断网也能查看密码”
所以要在本地完成计算。
同时“希望能在任何平台算出密码”
所以不想使用密码管理器。
~实施~
于是决定:
1.想好一个"盐"(可以有任何字符,长度也可以很大),记下来。
2.将其和要设置的网站的域名拼接
3.计算sha256
4.取最后几位作为该网站密码,位数建议多点(8…
~想法~
所以,改成什么?
1.自己要能记忆
2.不同网站/程序不一样
3.不同密码之间无关连
思考了一下
希望:“即使断网也能查看密码”
所以要在本地完成计算。
同时“希望能在任何平台算出密码”
所以不想使用密码管理器。
~实施~
于是决定:
1.想好一个"盐"(可以有任何字符,长度也可以很大),记下来。
2.将其和要设置的网站的域名拼接
3.计算sha256
4.取最后几位作为该网站密码,位数建议多点(8…
duangsuse::Echo
…8103 年 SHA256 早被撞烂了吧🌚
现在还好哇,我们现在很多文件验证也是用 SHA-256
何况我不是密码学的人不懂这些东西,我们只是用来写应用而已,很多 JVM 程序员这辈子干过和密码学最近的也不过就是用 IDEA 自动生成的 * 31
何况我不是密码学的人不懂这些东西,我们只是用来写应用而已,很多 JVM 程序员这辈子干过和密码学最近的也不过就是用 IDEA 自动生成的 * 31
int hashCode(); 算法了,我以后只要不是要忽略某些字段的 hashCode,再也不会让 IDEA 去自动生成这种无意义的代码
duangsuse::Echo
这次就有一些我最想先弄的东西: + 程序设计语言::Closure、Pattern Matching、Stream、Generators #pl #cs + 程序设计语言类型::常见名词 + 数据库::关系代数 #db + Java 的二进制流读写器 #bin + Java 的 Android android.content.SharedPreferences 代理库 Prefer + {软件架构, Android}::编写 Android ShutdownService + Kotlin::简单的…
这周份的 duangsuse::Echo 技术日常!包括计算机科学、关系代数、程序设计语言理论相关内容!
= 程序设计语言::Closure、Pattern Matching、Stream、Generators #PL #CS
Closure[wiki]: aka. Proc(Ruby)、闭包、Block、Chunk(Lua, 不完全是, Lua 里 Closure 等价的概念是自动内存管理和存储层的 UpValue 和 Proto,当然得配成一对才是闭包, Chunk 说的实际上是『一段完整的程序』)、Lambda(Lisp, Scheme, Haskell, Scala, etc.)、匿名函数(JavaScript, 虽然 ES6 也是有”箭头函数“的)
Python 和 ES6 的 decorators,也是基于他们的高阶函数支持而设计的。
代码块实际上是『上下文代码的一部分』,其概念源于 Lambda calculus — 函数可以返回函数,而『函数作为值』本身的意思,就是函数可以”独立“于调用栈的存储空间而存在,这意味着函数要知道自己定义时的作用域以保证再次执行时不会出 undefined reference 错 — 它可以『携带』自己所需要的定义离开一层函数调用栈帧,这就是 Lexical Scoping
非常明显的行为是,返回的 λy.... 里依然可以访问到 λx.... 里的变量 x
可是有人要写这样的程序:比如把
但是很不幸,函数式编程和面向对象混合的多范式成了主流;随处用高阶函数 Higher-Order-Function 和指定 receiver 的方法;于是这种辣鸡代码写起来不再有难度:
在 ES6 里支持模式识别的一种子集:
Destructuring assignment 解构赋值
我只知道,ES6 支持:
+ List pattern like
+
详情 MDN
Scala 的 Pattern Matching 详情这里
(比 ES6 的牛逼多了,因为 ES6 的只是结构赋值、Scala 的不仅可以解构赋值还可以判定)
因为上面定义了:Maybe a 可能是 Just a 或者 Nothing,它是 a 的 Sum type (tagged union)
Stream:
流式 API,充分利用对象自治性,是面向对象架构必须有的东西
= 程序设计语言::Closure、Pattern Matching、Stream、Generators #PL #CS
Closure[wiki]: aka. Proc(Ruby)、闭包、Block、Chunk(Lua, 不完全是, Lua 里 Closure 等价的概念是自动内存管理和存储层的 UpValue 和 Proto,当然得配成一对才是闭包, Chunk 说的实际上是『一段完整的程序』)、Lambda(Lisp, Scheme, Haskell, Scala, etc.)、匿名函数(JavaScript, 虽然 ES6 也是有”箭头函数“的)
Python 和 ES6 的 decorators,也是基于他们的高阶函数支持而设计的。
代码块实际上是『上下文代码的一部分』,其概念源于 Lambda calculus — 函数可以返回函数,而『函数作为值』本身的意思,就是函数可以”独立“于调用栈的存储空间而存在,这意味着函数要知道自己定义时的作用域以保证再次执行时不会出 undefined reference 错 — 它可以『携带』自己所需要的定义离开一层函数调用栈帧,这就是 Lexical Scoping
(lambda x.
lambda y. x) 1 ; res0=λy. 1(res0 2) ; 1非常明显的行为是,返回的 λy.... 里依然可以访问到 λx.... 里的变量 x
def foo()而以前我们直接用 Java 的 Collections framework 会这么写(虽然这里好像都是在用 [Array...):
a = 1 # 闭包里包含了这个局部变量,如果 lambda 被当成值返回,这个变量将会被保存
[1,2,3].map { |x| x + a } #=> [2,3,4]
end
public static final void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
非常愚蠢(但还是比汇编和 while 循环好多了)于是就有了 forEach,正如后来的 tryWithResource 和 Autoboxing 一样public static final void main(String... args) {
for (String s : args) System.out.println(s);
}
大括号保不保留就是一个见仁见智的问题,支持者认为不保留好看,不支持的人觉得重构麻烦容易出错,当然控制流跳转的 return 怎么用也是一样的见仁见智问题。可是有人要写这样的程序:比如把
int[] 变成 boolean[], 这要求 forEach 做它做不到的事情:先预备好一个同样维度的数组;知道当前在哪次循环;然后下标赋值目标数组,也就是说得同时读写两个数组,都需要下标public static final void main(String[] args) {
boolean[] args_bs = new boolean[args.length];
Predicate<String> predicate = s -> s.length > 10;
for (int i = 0; i < args.length; i++) {
args_bs[i] = predicate.test(args[i]);
}
}
于是又有了 init; p; op 的 for statement....但是很不幸,函数式编程和面向对象混合的多范式成了主流;随处用高阶函数 Higher-Order-Function 和指定 receiver 的方法;于是这种辣鸡代码写起来不再有难度:
fun profiteer(giftList: String)Pattern Matching[wiki]:
= fun output(writer: PrintStream)
= giftList
.split("\n")
.map(::Gift) // Constructor, (String) -> Gift
.map { it.mapIncreasePrice(10.dollars()) }
.forEach(writer::println)
在 ES6 里支持模式识别的一种子集:
Destructuring assignment 解构赋值
我只知道,ES6 支持:
+ List pattern like
[a, b = 2, c], [head, ...tail]
+ Object pattern { length: 2 = -1 }
+ 当然上面的 Object destruct 也可以用 ES6 的同名属性变量语法糖+
let { length } = [1] 里的 {length} 说的其实是 {length:length}, 给它指定了默认的键:length详情 MDN
Scala 的 Pattern Matching 详情这里
(比 ES6 的牛逼多了,因为 ES6 的只是结构赋值、Scala 的不仅可以解构赋值还可以判定)
def escape(s: String) = s match {
case 'q' :: xs => "\\q" ++ escape(xs);
case 'x' :: xs => "\\x" ++ escape(xs);
case x :: xs => x ++ escape(xs);
}
这种的 ES6 的解构赋值就做不到,不过也是因为模式匹配搞基一点的原因,所以会有诸如 Pattern exhaustiveness 之类的问题(比如 Haskell 里的 Maybe)data Maybe a = Just a | Nothing deriving (Eq, Show)可是
class FromMaybe a where
fromMaybe :: Maybe a -> a
instance FromMaybe String where
fromMaybe (Just s) = s
instance FromMaybe String... 会报错,因为 (
fromMaybe
:: Maybe a -> a) 只定义了解构
(Just ...) 这个数据构造器的解构器,到 Nothing 这个 case 就傻眼了(因为上面定义了:Maybe a 可能是 Just a 或者 Nothing,它是 a 的 Sum type (tagged union)
data Maybe a where实际上
Just :: a -> Maybe a
Nothing :: Maybe a
Sum type is a data structure used to hold a value that could take on several different, but fixed, types.
FromMaybe 这个用来进行 operator overloading 的 Typeclass 是完全设计错误的 ,它的 (fromMaybe
:: Maybe a -> a) 类型签名真的就是很愚蠢啊(除非有默认值,否则
(Maybe a) -> a 就是完全没有意义的事情)!Stream:
流式 API,充分利用对象自治性,是面向对象架构必须有的东西
val preference by lazy { Prefer.from(UserPreference::class) }
preference
.beginTx()
.setUserName("duangsuse")
.setIcon(File("duangsuse.png"))
.setAge(preference.age)
.delete("oldUserName")
.put("newUserNameNth", preference.read("newUserNameNth").or(0).inc())
.commit()
preference.userName //=> "duangsuse"
preference.length //=> 5
preference.has("user_name") //=> true
Generators[wiki]: aka. Coroutine(Lua), Fiber(in Ruby), Goroutine(Go), Suspend function/Coroutine(Kotlin), Generators(Python, JavaScript ES6, CSharp), Continuation(Scheme, Continuation 是一个抽象的程序执行状态,比 Coroutine 概念大一些)
duangsuse::Echo
啊嗨! java.lang.Deprecated 是什么鬼类型…
Kotlin:
交叉 inline 哦,双重 inline 那就叠在一起好了,免得 return 不到地方
交叉 inline 哦,双重 inline 那就叠在一起好了,免得 return 不到地方
inline infix fun <A, B, C> ((A) -> B).andThen(crossinline op: (B) -> C) = { x: A -> op(invoke(x)) }
REPL 里好像有问题,就infix fun <A, B, C> ((A) -> B).andThen(op: (B) -> C) = { x: A -> op(invoke(x)) }
inline fun <T> eq(me: T): (T) -> Boolean = { other -> me == other }
fun Class<*>.static() = object { public operator fun get(name: String): Field = this@static.getDeclaredField(name) }
fun assertSignedMinMax<reified T>(klass: Class<T>)
= fun assertLen(len: Int)
= (klass)
😶 没力气写了...println("forall x in Int. x in [2^32, 2^32-1]") (