我刚刚开始在Mono中使用F#,并且出现了以下问题,我无法理解.查找资料printfn,并TextWriterFormat没有带来任何启示,所以我想我要问在这里.
在FSI中,我执行以下操作:
> "hello";;
val it : string = "hello"
> printfn "hello";;
hello
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)
只是一个普通的字符串并打印它.精细.现在我想声明一个变量来包含相同的字符串并打印它:
> let v = "hello" in printfn v ;;
let v = "hello" in printfn v ;;
---------------------------^
\...\stdin(22,28): error FS0001: The type 'string' is not compatible with the type 'Printf.TextWriterFormat<'a>'
Run Code Online (Sandbox Code Playgroud)
我从阅读中理解,printfn需要一个恒定的字符串.我也明白,我可以解决这个问题printfn "%s" v.
但是,我想了解这里输入的内容.显然,"hello"类型string也是如此v.为什么会出现类型问题?有printfn什么特别的吗?据我所知,编译器已经对第一个字符串的参数执行了类型检查,这样就printfn "%s" 1失败了......这当然不适用于动态字符串,但我认为这只是编译器方面的一个方便.静态案例.
我刚刚遇到了Java java.awt.geom.Area#equals(Area)方法引起的问题.问题可以简化为以下单元测试:
@org.junit.Test
public void testEquals() {
java.awt.geom.Area a = new java.awt.geom.Area();
java.awt.geom.Area b = new java.awt.geom.Area();
assertTrue(a.equals(b)); // -> true
java.lang.Object o = b;
assertTrue(a.equals(o)); // -> false
}
Run Code Online (Sandbox Code Playgroud)
经过一番头脑刮擦和调试后,我终于在JDK源代码中看到了该equals方法的签名Area如下所示:
public boolean equals(Area other)
Run Code Online (Sandbox Code Playgroud)
请注意,它不是 @Override普通equals方法Object,而是使用更具体的类型重载方法.因此,上面示例中的两个调用最终调用了不同的实现equals.
由于Java 1.2以来存在此行为,我认为它不被视为错误.因此,我更感兴趣的是找出为什么决定不正确地覆盖该equals方法,但同时提供一个重载的变体.(另一个提示,这是一个真正的决定是没有覆盖hashCode()方法.)
我唯一的猜测是,作者担心缓慢equals的地区实现不适合放置比较时平等Area以s Set,Map等等.数据结构.(在上面的示例中,您可以添加a到a HashSet,虽然b等于a,但调用contains(b)将失败.)然后,为什么他们不仅仅以不与方法这样的基本概念冲突的方式命名可疑equals …
我想知道将abstract关键字与a结合使用的语义是什么trait.
如果特征没有定义任何抽象方法,则abstract关键字不会阻止我创建实例:
scala> abstract trait T
defined trait T
scala> new T{}
res0: java.lang.Object with T = $anon$1@12cd927d
Run Code Online (Sandbox Code Playgroud)
另一方面,如果特征确实定义了一个抽象方法,那么无论abstract关键字是否存在,我都无法创建实例(当然不实现此方法):
scala> abstract trait T { def foo : Unit }
defined trait T
scala> new T{}
<console>:9: error: object creation impossible, since method foo in trait T of type => Unit is not defined
new T{}
^
scala> trait T { def foo : Unit }
defined trait T
scala> new T{}
<console>:9: …Run Code Online (Sandbox Code Playgroud) 从Scala版本2.9开始,存在一个方便的转换器,可以java.util.List通过写下这样的内容将其他集合转换为Scala的数据结构:
import scala.collection.JavaConverters._
def scalaVersion = callJavaMethod.asScala
Run Code Online (Sandbox Code Playgroud)
这是一个可爱的小功能,因为它允许在与现有Java代码交互时利用Scala的优势.
但是,我不确定所涉及的时间和空间复杂性,并且在官方文档中找不到任何内容,因此,以下问题:
我在哪里可以获得有关JavaConverters的复杂性(时间和空间)的信息?
当使用完全限定的类名参数化时,我在Scala中的对象模式匹配中遇到一些问题.这基于Scala 2.9.0.1.谁知道这段代码有什么问题?
scala> "foo" match {
| case y : Seq[Integer] =>
| case y : Seq[java.lang.Integer] =>
<console>:3: error: ']' expected but '.' found.
case y : Seq[java.lang.Integer] =>
Run Code Online (Sandbox Code Playgroud)
为什么第一个版本有效,但后者失败了?当完全限定的类名用于参数化时,似乎只会出现此问题.
我正在寻找一个允许我在F#中使用逻辑变量的库/程序集.我想避免在实现所需的union-find数据结构,统一代码等方面重新发明轮子.
我找到了Prolog.NET,但手册有点稀疏.我不想要一个完整的Prolog实现,但只有它对逻辑变量和手册的处理在这方面是缺乏的.
这是我希望能够做到的:
有谁知道任何完成所有这些的库,或者至少可以用作起点的库?
我正在使用boost图库来调用dijkstra_shortest_paths.但是,我有一些特殊的设置,因为weight_map它实际上是一个仿函数.因此,每当boost库需要边缘的权重时,我的函子被调用,进行复杂的计算并将结果返回到提升.
不幸的是,在dijkstra_shortest_paths.hppstruct dijkstra_bfs_visitor的方法examine_edge中get调用了weightmap,只检查返回的值是否为负数.我完全清楚我不能使用负值的Dijkstra算法,我确信我的仿函数只返回正值.但是,此检查会导致我的仿函数为每个边缘调用两次.因为它执行一个复杂的计算,我想避免执行两次(结果不会在调用之间改变..每个边缘在dijkstra_shortest_paths运行期间获得相同的等待).
到目前为止,我手动检查传递给仿函数的边缘,如果重复调用,我将返回上一个记忆结果.这显然是一种解决方法而不是解决方案.
我试图通过我自己的覆盖覆盖的访问者examine_edge,然而,dijkstra_bfs_visitor仍然应用了由boost定义的原始方法.
有谁知道是否有更好的方法来处理这种情况,并以某种方式避免否定边缘权重检查?
我有一个二维矢量,如vector < vector < coordinates > > v( points);坐标类是:
class coordinate{
public :
int x;
int y;
coordinate(){
x=0;
y=0;
}
};
Run Code Online (Sandbox Code Playgroud)
并且点是20.如何基于v [i] .size()对各个向量v [i]进行排序,即基于在v [i]中推送的坐标对象的数量.???
我现在正在学习Lift.当我阅读有关模板的内容时,我知道他们有许多在编译时没有进行类型检查的东西:
是否有任何替代方案可以使这些问题不那么严重,即库中的外部代码检查程序或选项可以以类型安全的方式执行相同操作?或者可能存在另一个在这种关系中更严格的Web框架(可能是其他语言).
在eclipse中是否有办法自动添加TODO任务,例如: - //TODO: TO BE TESTED在函数或类的顶部,以便我可以轻松跟踪尚待测试的更改?
我刚刚发现了Project Sumatra,旨在将JVM引入显卡.从他们的网页,这包括Java 的自定义编译器(称为Rootbeer).
这是一个好消息,但是,如果这意味着苏门答腊项目也适用于其他JVM语言,我想听听对项目内部有更多了解的人的意见?是否有可能直接从Scala或Clojure发出Aparapi电话?或者您是否必须在Java中开发一些核心功能,然后通过其他JVM语言访问它?
#include <stdio>
int main(){
int x = 4;
int y = 3;
int z;
z = x---y;
printf("%d" , z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Linux Mandriva中的gcc编译器将其评估为(x--)-y.我很困惑为什么会这样.它可能是x - (--y).
我知道有些答案会告诉我查看优先级表.我已经完成了所有这些,但仍然存在疑问.
请任何人澄清一下.
我必须使用递归算法计算两个整数的总和,但真诚地我不知道如何这样做.以下是条件:
sum(x,y)=?
如果 x = 0 则 sum(x,y)= y 否则 sum(x,y)= sum(前趋(x),后继(y)).
有人知道如何在算法中写这个吗?任何建议我都会很高兴.