我想要做的事情在理论上很简单,但我无法让它发挥作用.
我写了一个简单的node.js脚本,该脚本使用该request包来异步获取一些数据,解析它并将其作为html吐出.我想将这个脚本集成到我的客户端基于php和apache的网站上,该网站位于共享主机上,并遇到了一些障碍:
node-cgi包,但它对我不起作用.我有关于内部节点方法不存在的错误,我认为这个包已经过时了.所以我已经着手试图简单地从PHP调用节点.我的整个index.php文件是:
<?php
header("Content-Type: text/html");
exec("node beerlist.nd", $output);
echo implode('', $output);
Run Code Online (Sandbox Code Playgroud)
当我php index.php在命令行上执行时,我得到了我期望的输出,但是,当我尝试从浏览器访问它时,我什么都没得到Content-Length: 0.为什么?
我想也许它与我的节点脚本的异步性质有关,但似乎该过程保持活着,直到它完成所有异步调用.那么我的php片段不应该毫无困难地将输出发送到浏览器吗?我在这里错过了什么?
编辑:我的节点脚本的要点是
var req = require('request')
req("http://mywebsite.com", function(err, resp, body) {
var output = // pull some interesting pieces out of the whole body
console.log(output);
});
Run Code Online (Sandbox Code Playgroud)
我的output变量的生成并不是这个问题的核心.相关部分是我request用来进行异步调用并用于console.log输出我的结果......也许这是一个问题?
我认为我对Haskell Monads有很好的处理,直到我意识到这段非常简单的代码对我来说没有意义(这是来自haskell wiki关于State monad):
playGame :: String -> State GameState GameValue
playGame [] = do
(_, score) <- get
return score
Run Code Online (Sandbox Code Playgroud)
令我困惑的是,为什么代码允许调用"get",当提供的唯一参数是字符串时?看起来它几乎就像是从空气中汲取价值.
对我提出问题的一个更好的方法可能是,如何使用>>=和lambda而不是表示法重写此函数?我自己无法弄明白.
Ruby的全新内容.这是一个简单的家庭作业.secret_code函数需要接受输入字符串并执行以下操作:
因此,如果输入是"超级duper",输出应该是"repud REPU".
我将函数编码如下:
def secret_code(input)
input.split(" ").first[1..-1].each_char do |i|
input[i] = i.upcase
end
return input.reverse
end
Run Code Online (Sandbox Code Playgroud)
它通过了单元测试,但我想知道是否有更好的方法来编码它.是否可以避免使用循环?我试过了
return input.split(" ").first[1..-1].upcase.reverse
Run Code Online (Sandbox Code Playgroud)
但那并没有奏效.任何关于如何清理它的想法都很感激!
我需要将一个函数应用于我的地图中的每个元素.此函数可能会导致新值或没有值的结果,因此我希望从我的地图中删除此键/值对.通俗地说,我的地图会随着时间的推移而缩小.
我喜欢alterData.Map中函数的声音,但它需要提供密钥.所以我的直觉说只是抓住钥匙keys并foldl'用我的地图作为累加器烹饪,并将键作为我的输入列表.
但这是一种有效的方法吗?在我的命令性思维中,我正在进行O(n)传递以获取键,然后我的foldl'将在O(nlogn)时间运行(log n以查找每个项目的n个项目).首先,当只需要一个时,似乎这将是2次传递.我开始知道,实际上,Haskell的懒惰会让这两个操作串联起来(也就是说,获取下一个键值,然后用它调用alter),所以这可能不是那么糟糕.但我宁愿在O(n)而不是O(nlogn)中找到一种方法.当我需要触摸所有项目时,必须单独"查找"每个项目显然有点过分,在我的情况下,顺序无关紧要.
或者,我想我可以将值复制到一个新的地图中并留下我不想要的那些,但我想这会简单地使用更多的内存并击败我缩小的地图的整个目的.
所以我正在寻找一些有关如何有效调整地图的提示.
注意,这个映射已经是foldl'中的累加器.
换句话说,我想做Data.Map.map但能够删除值.目前我正在做一张地图和一个过滤器,我正试图加快速度.
在我的代码中,我需要(Int, Int)按第二个元素的值对s 列表进行排序.
这很容易做到sorted = sortBy (\(_,a) (_,b) -> compare a b) listOfPairs,但我讨厌像这样写lambda,我需要在我的代码中的几个地方使用相同的lambda.
所以我试着创建两个有用的函数,我最终会在很多地方使用如下(我在前奏中找不到它们):
-- apply a function of one argument to two different arguments and return a pair
fBoth :: (a -> b) -> a -> a -> (b,b)
fBoth f a b = (f a, f b)
-- pass elements of a pair to a function of two arguments
expandPair :: (a -> b -> c) -> (a,b) -> c
expandPair f (a,b) = …Run Code Online (Sandbox Code Playgroud) 在我的代码中,我需要制作一个虚拟数组的副本.例如,阵列很简单$dummy = array('val'=> 0).我想制作这个数组的N个副本并将它们添加到具有类似结构的现有数组的末尾.显然这可以通过for循环来完成但是为了便于阅读,我想知道是否有任何内置函数可以使这更加冗长.
这是我使用for循环提出的代码:
//example data, not real code
$existingArray = array([0] => array('val'=>2),[1] => array('val'=>3) );
$n = 2;
for($i=0;$i<$n;$i++) {
$dummy = array('val'=>0); //make a new array
$existingArray[] = $dummy; //add it to the end of $existingArray
}
Run Code Online (Sandbox Code Playgroud)
重申一下,如果存在这样的函数,我想用函数重写它.有些事情(显然这些不是真正的功能):
//make $n copies of the array
$newvals = clone(array('val'=>0), $n);
//tack the new arrays on the end of the existing array
append($newvals, $existingArray)
Run Code Online (Sandbox Code Playgroud)