2014-09-27 54 views
0

我可以在F#做到这一点互动,并能正常工作:类型不匹配 - 在F#作品的互动,而不是在一个真正的F#项目

> printf "%d\n" 5;; 
5 
val it : unit =() 

但是,如果我做同样的事情在一个“实“F#项目:

let main argv = 
    printf "%d\n" 5 

当我尝试编译我得到这个错误:

Type mismatch. Expecting a 
    'a -> int  
but given a 
    'a -> unit  
The type 'int' does not match the type 'unit' 

ignore()结束语声明Ø r管道它忽略(|> ignore)也不起作用。

这是一个语义错误,但我不知道如何推理它,谷歌没有帮助。

它为什么在F#交互中工作,而不是在实际的F#项目中,它为什么在语义上是错误的?

回答

4

我假设你的main函数具有EntryPoint属性。

F#(与大多数语言一样)要求main返回一个int。

只需在主的末尾添加0即可。

+0

是的,就是这样。 * facepalm *我会在10分钟后立即接受答案。主要来自Java和C#背景,main通常不会返回任何值。 – rianjs 2014-09-27 23:59:59

+0

@rianjs实际上,在C#中,main可以返回int或void。如果它返回int,则将该值作为进程返回代码传回OS。 F#不支持void选项。 – phoog 2014-09-28 07:55:34

5

正如John Palmer所说,entry point函数的类型为string array -> int,所以最后一行必须是int

但是,您并不需要F#程序才能拥有入口点函数。你只需要在你的项目中的最后.fs文件上有你的代码。

enter image description here