我对以下剪切的行为感到困惑:
import Data.Int
import Data.Array.ST
import Control.Monad.ST
{-# INLINE fib #-}
fib _ 0 = return 0
fib _ 1 = return 1
fib c n = do
f1 <- memo c (fib c) (n-1)
f2 <- memo c (fib c) (n-2)
return (f1+f2)
newtype C a = C a
{-# INLINE memo #-}
memo (C a) f k = do
e <- readArray a k
if e == (-1)
then do
v <- f k
writeArray a k v …Run Code Online (Sandbox Code Playgroud) 我想知道reltool的以下行为背后的原因是什么:
如果我reltool.config使用默认mod_cond和incl_cond选项,并且我的一个包含的应用程序有一个模块,它也恰好是我的机器上安装的某个应用程序的一部分但未包含在我的发行版reltool中:get_target_spec/1返回:
{error, "Module <some_module> potentially included by two different applications: <system_app> and <my_app>."}
这很烦人,因为<system_app>它不是我发布的一部分(既不直接也不间接).难道reltool实际上<system_app>不知道我的发布中不会包含这些内容吗?这是为什么会这样"potentially included"?
无论如何,为了生成我的版本,我必须明确地排除<system_app>通过{app, <system_app> [{incl_cond, exclude}]}哪个是丑陋的,因为这<system_app>恰好安装在root_dir我进行构建的机器的Erlang/OTP系统中(它可能不安装在其他建立机器)并与我的发布无关.实际示例:tsung-1.4.3包含mochijson2模块,因此我在构建自己的版本时遇到问题,该版本应该包含mochiweb已tsung安装的计算机上的应用程序(但不包括在其他计算机上).另一种选择是改变顶级incl_cond的{incl_cond, derived}到{incl_cond, exclude},然后手动包括我想成为一个部分我的版本,这是更好(将任何构建机器上工作),但仍然不是很大,因为它有(我必须手动完成所有的应用想依靠relltool找出依赖关系).
所以问题是为什么我们有这样的情况呢?为什么仅仅在构建机器上存在某些应用程序会导致上述reltool错误?
PS作为附注,我相信当前版本的reltool_server.erl的第907-909行包含一个错误:bad argument如果它被调用它将生成它.
我正在努力理解为什么以下尝试在STArray中找到最小元素会导致堆栈空间溢出ghc(使用(7.4.1,无论-O级别)时),但在以下情况下工作正常ghci:
import Control.Monad
import Control.Monad.ST
import Control.Applicative
import Data.Array.ST
n = 1000 :: Int
minElem = runST $ do
arr <- newArray ((1,1),(n,n)) 0 :: ST s (STArray s (Int,Int) Int)
let ixs = [(i,j) | i <- [1..n], j <- [1..n]]
forM_ ixs $ \(i,j) -> writeArray arr (i,j) (i*j `mod` 7927)
-- readArray arr (34,56) -- this works OK
-- findMin1 arr -- stackoverflows when compiled
findMin2 arr -- stackoverflows when compiled
findMin1 …Run Code Online (Sandbox Code Playgroud)