我只是注意到通过运行的 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线程,我遇到了在通道中传递延迟评估值的问题.例如,使用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)