推文详情



@sh1marin@dabr.ca
草,我 debug 了半天没看懂为什么在 `Shell` Monad 里面的 printf IO 不工作,然后突然发现自己要 printf 的东西一闪而过,就被下一个 process 清空了,原来是 stdout inherit 的问题,好坑啊。


@sh1marin@dabr.ca

@sh1marin@dabr.ca




@sh1marin@dabr.ca
唉,就卡在一个 thread-safe & non-interleaving 的 print 上了。目前有个 concurrent-output 的库可以做这个事情,但是它也做了很多其它事情,不是一个足够简练的库。自己手写的话其实就还是两个路子,一个 MVar 的 mutex 锁,或者 channel。实现了一版走 channel 的,感觉太过于丑陋:所有调用 print 的子线程函数都要接受一个 channel 参数。我觉得这样去写代码不合理。如果用 IORef 去包一个全局 atomic 锁倒也在别的语言里常见,但在 Haskell 里可能不算 best practice。纠结了很久,群友推荐了一个 Monad Transform 的路子,我去学一下。