Skip to main content

curry

· One min read

haskell 有个高阶函数curry

我们可以通过:t identify来确定标识符的类型

我们使用haskellcli看看

Prelude> :t curry
curry :: ((a, b) -> c) -> a -> b -> c

这是什么意思呢? 我还没用懂

Lectures on Curry-Howard isomorphism[Sørensen & Urzyczyn 2006]Derivation and computation[Simmons 2000]Proofs and types[Girard, Lafont, Taylor 1996]

可扩展性

· One min read

什么是可扩展性?

我们先看有类型的情况

func(int x, int y){
return x+y
}

这个时候输入的是两个整数返回的是一个整数 x->y->z

可扩展性需要用类型系统或者形式化去描述

依赖和冲突

· One min read

纸带

state(状态)

我看到有关状态的书籍是在可计算理论相关的书籍,或者类型系统相关的书籍.

展开

f(f(A,B),f(D,E)) f(A,B,D,E); 循环依赖 f(f)

functor

· One min read

什么是范畴(category)?

范畴就是两个对象+一个映射关系组成的东西

什么是函子(functor)?

函子就是两个范畴加上这两个范畴的映射关系而组成

也就是说函子就是范畴+两个范畴的映射

hom函子是什么(hom functor)? // todo

Set

Set is the category with
objects: all sets.
arrows: given sets X, Y , every (total) set-function f : X -> Y is an
arrow.

type and function

类型是范畴里面的对象 函数是其中的箭头, 这样是对的吗? 好像不太对,那就应该是错的,但是他们隐隐中有关系,但是不像是是范畴.

相关阅读

tired

· One min read

我是理解能力有问题吗?

我真的不懂那些需求文档写的是什么,文档写的是什么.

文档应该是傻逼都能通过文档get到的才叫文档, 难道我比傻逼还傻?

范畴和米田引理

· 2 min read

https://segmentfault.com/a/1190000018331788

对于计算机来说,没有类型,没有函数,也没有oom,什么都没有

那么我们的程序是怎么来的呢?

映射和等价

https://bartoszmilewski.com/2015/10/28/yoneda-embedding/

我一直觉得sql的各种下推优化可以用米田引理或者范畴学来描述

最近在看一些范畴学的内容,我一直觉得我的逻辑很差,经常写bug,是不是我的逻辑太差呢?

我考虑的边界有问题?

是什么边界问题呢? 是我问题没有描述清楚还是什么呢?

还是需求提供者提的需求有问题呢?

范畴学真的很神奇

或者说,映射真的很神奇

如果我们要比较两个东西,那么我们先把他们映射成一个可比较的集合里面,然后他们就能比较了.

泛型是什么?

我一直想知道

raft

· 3 min read

背景

了解raft

组成

raft由三个模块组成:

  • Leader election: a new leader must be chosen when an existing leader fails
  • Log replication: the leader must accept log entries from clients and replicate them across the cluster, forcing the other logs to agree with its own
  • Safety: the key safety property for Raft is the State Machine Safety Property in Figure 3: if any server has applied a particular log entry to its state machine,then no other server may apply a different command for the same log index. Section 5.4 describes howRaft ensures this property; the solution involves an additional restriction on the election mechanism described in Section 5.2.

raft 里面apply 和commit 区别


在 Raft 算法中,"apply" 和 "commit" 是两个相关但不同的概念,它们与日志(log)的提交有关。

Commit(提交): 在 Raft 中,当一个领导者将一条日志(log entry)成功地复制到大多数节点的日志中时,该日志条目被认为是“已提交”(committed)。这意味着这个日志条目现在是可用于应用到状态机的。日志的提交是 Raft 中实现一致性的关键机制之一。

Apply(应用): 一旦一个日志条目被提交,领导者就可以将该日志条目中包含的命令应用于其本地状态机。这个过程被称为“应用”(apply)。通过应用日志中的命令,状态机可以执行相应的操作,从而在整个分布式系统中保持一致性。

简而言之,提交(commit)是指 Raft 中日志的复制达到足够的节点,而应用(apply)是指领导者将已提交的日志中的命令应用于本地状态机,以确保在整个系统中的一致性。这两个步骤是 Raft 算法中保证状态一致性的关键部分

相关阅读

php opcode to handler

· One min read

php 的opcode 对应很多的handler

选哪个handler 是怎么选择的呢?

和tcp协议一个连接 是一个五元组一样

php的opcode 的handler 是一个三元组 分别是 opcode , op1 , op2

核心函数

ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler(zend_op* op)
{
zend_uchar opcode = zend_user_opcodes[op->opcode];

...
// zend_opcode_handlers 是什么呢? 是一堆函数指针的数组 ,每个opcode + op1+ op2 决定一个 函数指针
op->handler = zend_opcode_handlers[zend_vm_get_opcode_handler_idx(zend_spec_handlers[opcode], op)];
}

所以核心的核心就是

zend_vm_get_opcode_handler_idx(zend_spec_handlers[opcode], op)

他做了什么呢? 其实就是算出zend_opcode_handlers这个函数指针数组的偏移值

一个sql的组成

· One min read

前言

写了很多mysql的sql,看了很多blog,兜兜转转,发现很多都是不太严谨的. 很多解释也是有点盲人摸象的感觉,不能说是错但是有些片面.

BNF和indeductly define set

select  name from  table where table.file =1;

三值

字符串和代码和编译

· One min read

代码是一堆字符串

代码会映射操作 然后这个就是一个编译的过程

所以编译就是一个映射的过程

很多编程语言其实都很像的,比如php和sql ,php的函数会放到一个全局的function_table 的hashmap里面,然后可以被调用. key是函数名,value是op_array

而mysql的内部函数也很类似,注册到一个hashmap里面:key是函数名,value则是相应的指针.

而类的加载方面,java和php也差不多.java的加载class其实就是反序列化的过程,然后放到内存,而php的opcache从某种程度上也是那种效果了