鉴于以下内容:
Route::get('project', function () {
$project = DB::table('pams_project')
->join('pams_developer', 'pams_project.dev_id', '=', 'pams_developer.id')
->select(array('pams_developer.developer_name',DB::raw(count('pams_project'.'dev_id'))))
->get();
return view('projectByDeveloper', ['project' => $project]);
});
debug = flip Debug.Trace.trace
foo = [1,2,3]
myRandom :: [a] -> IO Int
myRandom x =
let lx = Prelude.length x
in System.Random.randomRIO (0, lx) `debug` show lx
test = myRandom foo
的多次运行每次都会产生一个随机数,但只有第一次调用才会打印函数参数的长度。我假设它只计算一次。 Haskell默认会记住每个函数(在这种情况下是test
)吗?这是如何工作的?
答案 0 :(得分:3)
test
不是你打电话的功能;它是您执行的IO
操作。 debug
调用myRandom
,仅调用一次以生成IO
绑定到test
的操作。
要为每次执行操作获取调试输出,您需要在操作本身中嵌入对debug
的调用。
myRandom :: [a] -> IO Int
myRandom x = let lx = Prelude.length x `debug` "Getting length"
rnd = randomRIO (0, lx) `debug` "Getting generator"
in debug <$> rnd <*> pure (show lx)
现在,当您评估test
时,您第一次获得3行输出(表示length
和randomRIO
仅评估一次),但只有一行每个后续时间的输出行(表示每次都重新执行IO
动作rnd
)。