我正在阅读Gentle Introduction,我想知道为什么在使用两个生成器的列表理解中,最右边的生成器是"最快的"迭代(即编译到最里面的循环,我猜).观察以下GHCi输出:
*Main> concat [[(x,y) | x <- [0..2]] | y <- [0..2]]
[(0,0),(1,0),(2,0),(0,1),(1,1),(2,1),(0,2),(1,2),(2,2)]
*Main> [(x,y) | x <- [0..2], y <- [0..2]]
[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
Run Code Online (Sandbox Code Playgroud)
如果最左边的生成器迭代最快,上面两个表达式将具有相同的值,我认为这使得选择此约定更加自然.
那么有谁知道为什么选择相反的惯例?我注意到Python与Haskell具有相同的约定(甚至可能从Haskell借用它?),而在Python世界中,这个词似乎是选择了"因为这是你编写for循环的顺序",但是我认为,就for循环来说,思考并不是大多数Haskell程序员所做的......
思考?
从我对Louis Wasserman的回答如下:
我猜这里对应于理解的命令式解释的顺序被认为比嵌套列表更自然.所以在本质上,Haskell对此的解释与我在问题中链接的Python解释相同,毕竟,似乎.
我正在尝试为构建可执行文件的 cabal 项目编写测试套件。我希望套件中的测试运行该特定的可执行文件,但我不知道在哪里可以找到它(因为我的测试可能是从某个未知位置的沙箱中运行的)。
Cabal 在调用我的测试套件时应该知道我的项目的可执行文件在哪里。我的测试模块/程序有什么方法可以从 Cabal 收集这些信息和其他类似信息,也许是使用新的detailed-1.0测试框架?
有时在运行时nix-build,nixos-rebuild我发现了一些易于修复的问题(例如已弃用的警告或多余的导入),我想“很有趣,我可以在空闲时间修复它”。
我知道我可以将构建日志重定向到一个文件,但我一直忘记这样做,直到我再次看到警告。
问题:nix 构建守护进程是否将构建日志保存在某处?