我尝试使用sbt启动器版本0.12.1使用CLI参数运行我的scala项目.从scala提示符运行时它可以正常工作:
$ sbt
[info] (...)
> run sth
(...)
[success] Total time: 0 s, completed Nov 9, 2012 3:04:47 PM
Run Code Online (Sandbox Code Playgroud)
但是当我想从shell运行它时,根据这个答案,例如,我收到一个错误:
$ sbt "run sth"
[info] (...)
you need to provide source file name
[success] Total time: 0 s, completed Nov 9, 2012 3:07:07 PM
[error] Not a valid command: sth (similar: set, last, shell)
[error] Expected '/'
[error] Expected ':'
[error] Not a valid key: sth (similar: test, state, watch)
[error] sth
[error] ^
Run Code Online (Sandbox Code Playgroud)
并且我的scala项目给出了"您需要提供源文件名"信息,以指示main没有获得任何CLI参数.
它是在先前版本的sbt中工作的(在引用的问题中),还是我做错了什么?
在官方的akka 2.0.4文档中,它说:
actor重新启动只替换实际的actor对象; 邮箱的内容不受重新启动的影响,因此在postRestart挂钩返回后将继续处理消息.将不再接收触发异常的消息.在重新启动时发送给actor的任何消息都将像往常一样排队到其邮箱.
假设我有一条消息导致我的演员重新开始.它不再存在于邮箱中,因此它不会被将要占据它的角色处理.如果我希望这个消息由演员处理(假设在这种情况下顺序无关紧要),演员在重启时将消息发送给自己是不是一个坏主意?
一些(伪)代码显示我的意思:
class ResendingActor extends Actor {
var curMessage: Option[MyMessage] = None
def receive = {
case MyMessage(x) => {
curMessage = Some(MyMessage(x))
/* processing */
curMessage = None
}
}
override def preRestart(reason: Throwable, message: Option[Any]) {
curMessage match {
case Some(x) => self ! x
case None => ;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样,在重新启动之前,actor未处理的消息被推送到新actor的队列末尾.
所以我的问题是:我有什么理由不这样做吗?
我唯一能想到的是,如果消息由于某种原因而变形,它将永远不会离开系统并导致演员经常重启...
在我的项目中,我创建了一个数据类型,它可以包含几种类型的值之一:
data PhpValue = VoidValue | IntValue Integer | BoolValue Bool
Run Code Online (Sandbox Code Playgroud)
我现在想做的是,有一个简单的方法来检查这个PhpValue类型的两个值是否是相同的构造函数(如果我在这里与术语混淆,请纠正我,但基本上我要检查两者是否是,例如,是IntValue,不关心特定的价值).
这是我为此写的一个函数:
sameConstructor :: PhpValue -> PhpValue -> Bool
sameConstructor VoidValue VoidValue = True
sameConstructor (IntValue _) (IntValue _) = True
sameConstructor (BoolValue _) (BoolValue _) = True
sameConstructor _ _ = False
Run Code Online (Sandbox Code Playgroud)
这应该工作,但我真的不喜欢它:如果我添加更多的构造函数(比如FloatValue Float),我将不得不重写函数,随着我的数据定义变大,它会变大.
问题:有没有办法编写这样的函数,以便在添加更多构造函数时它的实现不会改变?
为了记录:我不想改变data定义,我在其余的代码中有足够的Monads;)
假设我有一个多维数组pi,并且在运行时之前它的维数是未知的:
dims <- rep(3, dim_count)
pi <- array(0, dims)
Run Code Online (Sandbox Code Playgroud)
如您所见,尺寸计数取决于dim_count.当我有索引向量时,如何从数组中检索值?例如,当我有:
dim_count <- 5
indexes <- c(1, 2, 3, 3, 3)
Run Code Online (Sandbox Code Playgroud)
我想要检索
pi[1, 2, 3, 3, 3]
Run Code Online (Sandbox Code Playgroud)
有这么简短,有效且有希望的优雅方式吗?
在Haskell中,您可以构建参数化类型,如以下示例所示:
data Tree a = Leaf | Node a (Tree a) (Tree a)
Run Code Online (Sandbox Code Playgroud)
..然后,如果type参数也是同一类型类的实例,则将它们作为类型类的实例(此处使用Eq作为示例,它可以是任何内容):
instance (Eq m) => Eq (Tree m) where
Leaf == Leaf = True
Node a b c == Node x y z = (a == x) && (b == y) && (c == z)
_ == _ = False
Run Code Online (Sandbox Code Playgroud)
我想知道在Scala中可能有类似的事情.要开始,让我们创建参数化类型:
abstract class Tree[T]
case class Leaf[T]() extends Tree [T]
case class Node[T](value: T, left: Tree[T], right: Tree[T]) extends Tree [T]
Run Code Online (Sandbox Code Playgroud)
..并选择一个更简单的特性作为实现的类型类:
trait Serializable {
def toDifferentString(): …Run Code Online (Sandbox Code Playgroud) 我计划在我的Scala代码中开始使用Monadic样式,其中包括线程状态.这是一个结合3个monadic函数的简化示例(并且仅关注副作用)
import scalaz._
import Scalaz._
object MonadTest {
def adder(i: Int) = State[String, Int] ({str: String => (str + i.toString + " ", i) })
val oneTwoThreeMonad = for {
m1 <- adder(1)
m2 <- adder(2)
m3 <- adder(3)
} yield m3
oneTwoThreeMonad("start: ")._1 //String = "start: 1 2 3 "
}
Run Code Online (Sandbox Code Playgroud)
这一切都是不言自明的,并按预期工作.但是对于这种对我来说非常有用的方法,我希望能够将它与Listfor-comprehension 结合起来.这是一些(不工作)代码来显示我的意思:
val list = List(1, 2, 3)
val oneTwoThreeBis = for {
i <- list
mx <- adder(i)
} yield mx
Run Code Online (Sandbox Code Playgroud)
基本上我希望能够基于来自a的参数组合monad List- 运行monadic函数对其中的每个元素 …
我正在编写一个全文搜索功能的原型,它将在搜索结果中返回找到的文档的"标题".这是Postgres文档中稍微修改过的示例:
SELECT ts_headline('english',
'The most common type of search is to find all documents containing given query terms <b>and</b> return them in <order> of their similarity to the query.',
to_tsquery('query & similarity'),
'StartSel = XXX, StopSel = YYY');
Run Code Online (Sandbox Code Playgroud)
我期望的是什么样的
"documents containing given XXXqueryYYY terms <b>and</b> return them in <order> of their XXXsimilarityYYY to the XXXqueryYYY."
Run Code Online (Sandbox Code Playgroud)
我得到的是
"documents containing given XXXqueryYYY terms and return them in of their XXXsimilarityYYY to the XXXqueryYYY."
Run Code Online (Sandbox Code Playgroud)
看起来像HTML标签一样远程看起来的所有内容都被剥离并替换为单个空格字符(注意周围的双重空格and).
我没有在文档中找到任何声明Postgres假设输入文本是HTML并且用户希望剥离标签的地方.该API允许压倒一切的StartSel,并StopSel …
我决定在我的项目中包含一个库(更具体地说是yaml-cpp).由于两个项目(yaml-cpp和我的)都使用CMAKE进行构建,我决定尝试将yaml-cpp目录放在我的根目录中并使用add_subdirectory(yaml-cpp)和target_link_libraries(${EXECUTABLE_NAME} foolib yaml-cpp),因为yaml-cpp的CMakeLists.txt已经包含
include_directories(${YAML_CPP_SOURCE_DIR}/include)
# ...
add_library(yaml-cpp
${sources}
${public_headers}
${private_headers}
${contrib_sources}
${contrib_public_headers}
${contrib_private_headers}
)
Run Code Online (Sandbox Code Playgroud)
......我应该对包括和图书馆目标都很好.但事实证明,在编译时我得到以下错误:
P:\ zpp\TheGameShow\TGS.cpp(16):致命错误C1083:无法打开包含文件:'yaml-cpp/yaml.h':没有这样的文件或目录
...除非我include_directories(${YAML_CPP_SOURCE_DIR}/include)在我自己的CMakeLists.txt中复制该行
我的问题是:这是理想的行为吗?包含目录不应该从子目录传播到根目录吗?难道我做错了什么?
编辑:我使用的是Visual Studio 2010和CMake 2.8.6
我想在Google Test中对我的Word结构进行简单的测试.为了使测试代码更简单和更短的,我决定写一个比较操作(尽管我并不真的需要一个),只使用ASSERT_EQ,按照底漆.即使一切似乎都没问题,我收到编译错误:
/* Word.h */
namespace tgs {
struct Word {
//something here
Word();
virtual ~Word();
bool operator== (Word& rhs);
};
}
/* Word.cpp */
namespace tgs {
bool Word::operator== (Word& rhs){
return true; //there are actual member comparisons here
}
}
/* TextAreaShould_test.cc */
TEST_F(TextAreaShould, DoSomething) {
Word w1, w2;
if(w1 == w2){ //compiles and runs ok
0;
}
ASSERT_EQ(w1, w2); //produces following error
}
Run Code Online (Sandbox Code Playgroud)
编译器错误:
[ 86%] Building CXX object CMakeFiles/tests/TextAreaShould.test.dir/tests/TextAreaShould_test.cc.o
/usr/bin/c++ -I/home/nietaki/zpp/TheGameShow_build -I/home/nietaki/zpp/TheGameShow …Run Code Online (Sandbox Code Playgroud) 我有一段代码,简化了一点,相当于以下编译和正常工作.
template <typename Interface, typename... Args>
struct factory_function {
typedef function<shared_ptr<Interface> (Args...)> type;
};
template <typename Interface, typename Implementer, typename... Args>
shared_ptr<Interface> create_function(Args... args) {
return make_shared<Implementer>(args...);
}
template <typename Interface, typename... Args>
int register_factory(identifier id, typename factory_function<Interface, Args...>::type factory) {
}
int main(int argc, char *argv[]) {
register_factory<Iface>(1000, create_function<Iface, Impl>);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当尝试using ... =在这样的结构中使用较新的构造而不是typedef时:
template <typename Interface, typename... Args>
using factory_function = function<shared_ptr<Interface> (Args...)>;
Run Code Online (Sandbox Code Playgroud)
然后typename factory_function<Interface, Args...>::type改成factory_function<Interface, Args...>,我得到一个编译错误:
foo.cc: In function …Run Code Online (Sandbox Code Playgroud)