机器人:
这个机器人在用户加群时,先封了发消息的权限,然后利用 inline button 验证用户是否是机器人
— 选择:
[message]
<i> 1+1 = ? </i>
[A] [B] [C]
[管理手动允许] [管理手动踢出]
前两行依赖的状态应当在一个子程序里设计,存储由 Telegram messager 包办
后两个本身没有属于它们自己的状态
三个操作只存在一个状态:目标操作用户,可以利用 Telegram message API 拿被回复者 ID 得到
状态:其实没有必要使用状态机模型,程序对每个新加用户只运行一次,并且状态由 Telegram 本身管理
机器人只是负责在状态转移时添加逻辑、捕获并且改变状态而已。
这种情况
状态是什么呢?状态是不能在一次里,由 signal handler 解决的东西,比如数据的存储,是一种处理上下文。
它意味着处理的决策条件跨越了一次处理的生存周期,必须在多次处理间都可以被访问到。
对于每个用户来说,机器人的出现赋予了他们一个新状态转移图:
NEWCOMER=BLOCKED(0), ACCEPTED, REJECTED
NEWCOMER (pass / adminAccept)~> ACCEPTED
NEWCOMER (timeout ns / adminReject) ~> REJECTED
listen onNewComer(uimesg) { block(uimesg.user), sendBoard(uimesg), save[uimesg.u] = setTimeOutKicker }
listen onPass / adminAccept (u) { save[u].cancel() } // ACCEPTED
listen adminReject (u) { kick(u) }
listen* save.onTimedout(it) { kick(it) }
其中 timeout 也是一种状态(准确的说只是实现它需要状态计数,当然这本身是抽象的),是一个异步信号(当然其他几个也都是异步的,一般来说,同步信号的意味是『它只是一个可以 inline 的子程序』)
从用户可能的状态转移图来看,逻辑也很明显了,就是存储的分配、模块的细分、逻辑和数据依赖还需要思考
这个机器人在用户加群时,先封了发消息的权限,然后利用 inline button 验证用户是否是机器人
— 选择:
[message]
<i> 1+1 = ? </i>
[A] [B] [C]
[管理手动允许] [管理手动踢出]
前两行依赖的状态应当在一个子程序里设计,存储由 Telegram messager 包办
后两个本身没有属于它们自己的状态
三个操作只存在一个状态:目标操作用户,可以利用 Telegram message API 拿被回复者 ID 得到
状态:其实没有必要使用状态机模型,程序对每个新加用户只运行一次,并且状态由 Telegram 本身管理
机器人只是负责在状态转移时添加逻辑、捕获并且改变状态而已。
trigger onNewMember(u: User) {
blockUser(u)
val (truth, expr) = makeNewMathProblem()
val [fake0, fake1] = listOfNulls(2).map(::makeFakeSolution)
val board = Board( MathBoard(expr, truth, listOf(fake0, fake1) ) )
board.inlineQueryCallbacks = RELEASE_USER
u.replyTo(board).also { setTimerTo(kickUser(u), Config.NS) }
}
问题是,机器人要处理状态还是有的,就是每个 (NEWCOMER) 用户都对应一个 timer(当然还有 Telegram 本身需要存储的部分信息,比如机器人对加群消息的回复,不过这个状态写成代码不明显),ns 后会直接视为机器人踢出这种情况
状态是什么呢?状态是不能在一次里,由 signal handler 解决的东西,比如数据的存储,是一种处理上下文。
它意味着处理的决策条件跨越了一次处理的生存周期,必须在多次处理间都可以被访问到。
对于每个用户来说,机器人的出现赋予了他们一个新状态转移图:
NEWCOMER=BLOCKED(0), ACCEPTED, REJECTED
NEWCOMER (pass / adminAccept)~> ACCEPTED
NEWCOMER (timeout ns / adminReject) ~> REJECTED
listen onNewComer(uimesg) { block(uimesg.user), sendBoard(uimesg), save[uimesg.u] = setTimeOutKicker }
listen onPass / adminAccept (u) { save[u].cancel() } // ACCEPTED
listen adminReject (u) { kick(u) }
listen* save.onTimedout(it) { kick(it) }
其中 timeout 也是一种状态(准确的说只是实现它需要状态计数,当然这本身是抽象的),是一个异步信号(当然其他几个也都是异步的,一般来说,同步信号的意味是『它只是一个可以 inline 的子程序』)
从用户可能的状态转移图来看,逻辑也很明显了,就是存储的分配、模块的细分、逻辑和数据依赖还需要思考
NEWCOMER (merge = Telegram::User on NewMember)这些『NEWCOMER』的用户状态转移就构成了机器人的 stateful 逻辑
/ \
| |
tout, |
akick |
| |
| (pass, aac)
REJ AC
(block) (ignore him)
Forwarded from Deleted Account
您已通过验证,欢迎加入 LetITFly's Group 喵!
如果仍然无法发言,请重启 Telegram 客户端。
如果仍然无法发言,请重启 Telegram 客户端。
学了三四个月 = 入门 Haskeller
我不知道还有 Strict, BangPattern, GHC-OPTIONS 这几个 Pragma...
我只知道虽然 [Char] 很浪费内存空间效能低,以及有 bytestring,不知道还有 Data.Text 和 Data.Text.IO....
我不知道还有 Strict 求值模式... 我以为只能惰性求值的(当然现在解释器那块基本可以说是无障碍了,毕竟三种求值模型 name, need, expr 还是在 AST Walker 里毕竟 trivial 的,内嵌 AST 基本就可以了、Lexical Scoping 我现在了解了 Scheme 系直接 copy 一份栈 env 的实现,Lua 的 UpValue 实现)
我不知道居然还有 State MonadT 和 RealWorld.... 而且我现在对 Monad 很头疼,主要是想重视理论先的原因,而范畴论本身不太好理解...
Data.Vector.Unboxed.Mutable.MVector 我就更不知道了... 当然存在使用副作用模式的 Haskell 还是知道的(我很少写 IO,算法更不提了.... 公式好像都难背)。
我不知道怎么用 Monad Transformer(State 和 GHC.Prim.RealWorld),而且我现在对 Monad 的理解还在想办法合并,本身使用上除了 convert do notation 外没啥暖用了,Identity/Reader Monad (算是 Haskeller Monad primer 的 Helloworld...)也是才写一次... 还不能完全默写
读入优化那个解析程序是我昨天刚说的,各种自闭,膜拜 hs 大佬...
我真的很佩服蛤丝靠大佬,怎么就那么 ****** 啊!!!!!(土拨鼠尖叫) 😭
我不知道还有 Strict, BangPattern, GHC-OPTIONS 这几个 Pragma...
我只知道虽然 [Char] 很浪费内存空间效能低,以及有 bytestring,不知道还有 Data.Text 和 Data.Text.IO....
我不知道还有 Strict 求值模式... 我以为只能惰性求值的(当然现在解释器那块基本可以说是无障碍了,毕竟三种求值模型 name, need, expr 还是在 AST Walker 里毕竟 trivial 的,内嵌 AST 基本就可以了、Lexical Scoping 我现在了解了 Scheme 系直接 copy 一份栈 env 的实现,Lua 的 UpValue 实现)
我不知道居然还有 State MonadT 和 RealWorld.... 而且我现在对 Monad 很头疼,主要是想重视理论先的原因,而范畴论本身不太好理解...
Data.Vector.Unboxed.Mutable.MVector 我就更不知道了... 当然存在使用副作用模式的 Haskell 还是知道的(我很少写 IO,算法更不提了.... 公式好像都难背)。
我不知道怎么用 Monad Transformer(State 和 GHC.Prim.RealWorld),而且我现在对 Monad 的理解还在想办法合并,本身使用上除了 convert do notation 外没啥暖用了,Identity/Reader Monad (算是 Haskeller Monad primer 的 Helloworld...)也是才写一次... 还不能完全默写
读入优化那个解析程序是我昨天刚说的,各种自闭,膜拜 hs 大佬...
我真的很佩服蛤丝靠大佬,怎么就那么 ****** 啊!!!!!(土拨鼠尖叫) 😭
/tmp/duangsuse.sock
#oi #oj https://www.luogu.org/problem/P3367 推荐一个题目
https://www.luogu.org/discuss/show/125819
啊啊啊啊我死了,楼主 HT(被冰封哥称为萝莉大佬)据说还是个高中还是初中生啊... 拿 Haskell 写并查集....
啊啊啊啊我死了,楼主 HT(被冰封哥称为萝莉大佬)据说还是个高中还是初中生啊... 拿 Haskell 写并查集....
/tmp/duangsuse.sock
#China #OI 我真的服了,线上一大堆求助 TLE 的,他们是不知道还有效率复杂度需求么,还有莫名其妙什么『哪错了』『求助』这种帖子,我去
『 好像洛谷java没有额外的时间空间是吗?』『并查集一定要初始化自己为自己爹吗』这种标题叫 OK 的标题
『 求助,只有1和4两个点过了,其他全wa』『 新人求教???』叫还行的标题
『 为什么70啊』『为何错了』『哪错了』 谁会做这题?』叫傻标题
『 求助,只有1和4两个点过了,其他全wa』『 新人求教???』叫还行的标题
『 为什么70啊』『为何错了』『哪错了』 谁会做这题?』叫傻标题
Forwarded from Deleted Account
冰封说是 Scope 是 CPS(Continuation-Passing-Style) 出来的 context... 我想想
不像我这个辣鸡,人家现在回复不需要两分钟,两秒就得去忙别的了...
不像我这个辣鸡,人家现在回复不需要两分钟,两秒就得去忙别的了...
Forwarded from Deleted Account
http://blog.hoshino9.org/2018/12/31/paint-board.html 大小姐的博客,当然 coroutine 使用我之前说过... 不过 CG 还是...
blog.hoshino9.org
临终之日, 新年之时
最后一天今天就是这一年的最后一天了与此同时, 你谷 也迎来了冬日绘板活动也因此, 各类脚本层出不穷不过说到底, 绘板的竞争还是脚本的竞争是 Cookie 数量的竞争
Forwarded from Deleted Account
Kotlin Coroutine
刚才我甚至已经弱智到忘了携程是咋执行的了... 的确是串行的
刚才我甚至已经弱智到忘了携程是咋执行的了... 的确是串行的
Forwarded from Deleted Account
果然还是实践很重要啊,理论就考虑不到这种问题,GlobalScope 还和本地的 runBlocking scope 有区别...
调⽤了 runBlocking 的主线程会⼀直阻塞 直到 runBlocking 内部的协程执⾏完毕。
Forwarded from Deleted Account
非对称协程我都忘了,居然还有这种东西... 还存在一个 scope 和父子协程.... 那父协程可以叫醒儿子儿子不能反了爸爸,爸等(
timer.await())儿,独立再调教一下(GlobalScope.async { timer = delay(3000) }),完美... 这个 Scope 的直觉又是啥子
Deleted Account
冰封说是 Scope 是 CPS(Continuation-Passing-Style) 出来的 context... 我想想 不像我这个辣鸡,人家现在回复不需要两分钟,两秒就得去忙别的了...
携程本身就是 CPS 吧(实现起来麻烦一点,要 capture 执行状态,整个数据栈包括然后指令的执行状态也得包括)... 这么说是那种... 对爸爸的数据依赖?