小编chr*_*gue的帖子

如何将环境变量传递给通过堆栈运行的 Haskell 程序?

我只是注意到通过运行的 Haskell 程序stack不会从调用环境接收环境变量。这是一个示例程序:

-- testenv.hs
import System.Environment
main :: IO ()
main = print =<< getEnv "FOOBAR"
Run Code Online (Sandbox Code Playgroud)

如果我在没有堆栈的情况下运行它,就像这样,它可以工作:

% FOOBAR=123 runhaskell testenv.hs
"123"
Run Code Online (Sandbox Code Playgroud)

但是使用堆栈:

% FOOBAR=123 stack runhaskell testenv.hs
testenv.hs: FOOBAR: getEnv: does not exist (no environment variable)
Run Code Online (Sandbox Code Playgroud)

编译时也是如此:工作时FOOBAR=123 stack exec testenv失败FOOBAR=123 .stack-work/install/BLAHBLAH/testenv

有没有办法强制堆栈传递某些环境变量?

我遇到的真正问题是yesod devel,我想用环境变量覆盖一些设置,但yesod devel使用堆栈来运行程序,因此它们不会通过。

这是 NixOS 18.03.132262.0a73111bc29 上的堆栈 1.6.5。

haskell environment-variables nixos haskell-stack

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

Haskell中并发通道的严格评估技术

我正在玩Haskell线程,我遇到了在通道中传递延迟评估值的问题.例如,使用N个工作线程和1个输出线程,工作人员传达未评估的工作,输出线程最终为他们完成工作.

我已经在各种文档中看到了这个问题并看到了各种解决方案,但我发现只有一个解决方案可行,其余解决方案则没有.下面是一些代码,其中工作线程开始一些可能需要很长时间的计算.我按降序启动线程,这样第一个线程应该占用最长的,后面的线程应该更早完成.

import Control.Concurrent (forkIO)
import Control.Concurrent.Chan   -- .Strict
import Control.Concurrent.MVar
import Control.Exception (finally, evaluate)
import Control.Monad (forM_)
import Control.Parallel.Strategies (using, rdeepseq)

main = (>>=) newChan $ (>>=) (newMVar []) . run

run :: Chan (Maybe String) -> MVar [MVar ()] -> IO ()
run logCh statVars = do
  logV <- spawn1 readWriteLoop
  say "START"
  forM_ [18,17..10] $ spawn . busyWork
  await
  writeChan logCh Nothing -- poison the logger
  takeMVar logV
  putStrLn "DONE"
  where
    say mesg = force mesg >>= …
Run Code Online (Sandbox Code Playgroud)

concurrency haskell strictness

4
推荐指数
1
解决办法
821
查看次数