gpt4 book ai didi

haskell - 干净地替换当前的 Haskell 进程 (exec)

转载 作者:行者123 更新时间:2023-12-04 01:07:03 24 4
gpt4 key购买 nike

我正在编写一个 Haskell 程序,其唯一目的是在收集一些信息以确定应该使用哪些参数执行该程序后执行另一个(非 Haskell)程序。

使用 executeFile 替换正在运行的 Haskell 进程非常简单,但我想知道是否有一种方法可以确保 Haskell 程序在被替换之前正确地自行清理。

例如,Control.Exception.finally 通常有助于确保执行清理操作,即使发生异常也是如此,但如果我们执行一个完全不同的进程,它将无效:

module Main (main) where

import Control.Exception (finally)
import System.Posix.Process (executeFile)

main = finally (do putStrLn "opening file descriptors"
putStrLn "writing temporary files"
executeFile "ls" True [] Nothing)
(putStrLn "cleaning up")

上面的例子永远不会打印“cleaning up”。

是否有推荐的方法来“干净地”执行这种操作?

最佳答案

您需要将 executeFile 放在 finally 之后,因为它完全替换了 Haskell 程序中的任何代码.

main = do
finally (putStrLn "opening" >> putStrLn "writing") (putStrLn "cleaning up")
executeFile "ls" True [] Nothing

executeFile 可能发生的唯一异常是 exec 本身的问题,但是您必须继续执行,就好像 exec 会工作并且您不会返回到 Haskell 代码;这是单向 goto,而不是子例程调用。

关于haskell - 干净地替换当前的 Haskell 进程 (exec),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56640944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com