小编Jan*_*ček的帖子

如何从 sigTERM 处理程序退出程序?

考虑这样的事情:

...

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)

haskell

6
推荐指数
1
解决办法
523
查看次数

实现指树时“添加删除检查规则时溢出”

我正在尝试定义一个手指树结构并实现其基本操作作为 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)

rust data-structures recursive-type

5
推荐指数
1
解决办法
363
查看次数

Haskell 列出 monad 并返回 ()

考虑以下代码:

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 () …

haskell

5
推荐指数
1
解决办法
113
查看次数

标签 统计

haskell ×2

data-structures ×1

recursive-type ×1

rust ×1