考虑这样的事情:
...
handleShutdown :: ThreadId -> IO ()
handleShutdown tid = doSomethingFunny >> throwTo tid ExitSuccess
main = do
...
installHandler sigTERM (Catch $ myThreadId >>= handleShutdown) Nothing
forever $ do
stuff
...
Run Code Online (Sandbox Code Playgroud)
如果sigINT(Ctrl+C) 以这种方式处理,则该过程会很好地完成。但是,似乎sigTERMHaskell 内部正在使用,上面的代码根本没有从主进程中退出。有没有办法在sigTERM不使用MVar自定义循环的情况下从处理程序退出进程?我在任何sigTERM地方都找不到有关处理的任何信息(没有阅读 ghc 来源,这对我来说太多了)。
更新:
以下工作:
main = do
...
tid <- myThreadId -- This moved out of the Catch handler below.
installHandler sigTERM (Catch $ handleShutdown tid) Nothing
forever $ do
stuff
...
Run Code Online (Sandbox Code Playgroud) 我正在尝试定义一个手指树结构并实现其基本操作作为 Rust 中的练习。我提出了以下内容,基本上就是本文中描述的内容。
use self::FingerTree::{Empty, Single, Deep};
use self::Digit::{One, Two, Three, Four};
enum Digit<A> {
One(A),
Two(A, A),
Three(A, A, A),
Four(A, A, A, A),
}
enum Node<V, A> {
Node2(V, A, A),
Node3(V, A, A, A),
}
enum FingerTree<V, A> {
Empty,
Single(A),
Deep {
size: V,
prefix: Digit<A>,
tree: Box<FingerTree<V, Node<V, A>>>,
suffix: Digit<A>,
},
}
fn main() {
let e: FingerTree<i32, String> = Empty;
}
Run Code Online (Sandbox Code Playgroud)
编译给我一个我不明白的错误:
use self::FingerTree::{Empty, Single, Deep};
use self::Digit::{One, Two, Three, Four}; …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
foo :: [Int]
foo = do
x <- [1..10]
if x < 5 then pure () else [] -- Control.Monad.guard (x < 5)
pure x
foo2 :: [Int]
foo2 =
[1..10] >>= \x ->
if x < 5 then pure x else [] >>= \y ->
pure y
Run Code Online (Sandbox Code Playgroud)
在 中foo,我已手动内联Control.Monad.guard (x < 5),如评论中所述。
为什么foo编译,即使pure ()在代码中?如何[()]通过类型检查?它是 do 语法的特例吗?如果是,是否在任何地方进行了描述?
在 中foo2,我尝试在foo没有 do 语法的情况下“脱糖” 。请注意,不能有 any pure () …