函数的Haskell评估调用函数参数

时间:2018-04-16 16:34:42

标签: haskell

鉴于以下内容:

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)吗?这是如何工作的?

1 个答案:

答案 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行输出(表示lengthrandomRIO仅评估一次),但只有一行每个后续时间的输出行(表示每次都重新执行IO动作rnd)。