你可以在F#中给函数特定的类型签名吗?

你可以在F#中给函数特定的类型签名吗?

问题描述:

嗨我已经开始学习F#,我在想你是否可以限制函数的输入和输出的类型。你可以在F#中给函数特定的类型签名吗?

我试着这样做:

main : unit 
let main = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n") 
let _ = main 

,我也试图把letmain之前的第一道防线。都没有工作。有没有办法在F#中做这种事情?我认为这是Haskell的一个很好的功能。

是的,这是完全可能的:

let main : unit = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n") 

此外,几个小点:

首先,而非\n在结束时,你可以使用printfn

其次,lambda表达式中的x是多余的,lambda表达式本身也是如此。测序多次调用,你可以简单地按顺序列出这些,每一个新的行(或用分号隔开):

let main : unit = 
    printfn "Hello World" 
    printfn "Goodbye World" 

第三,这样一来你没有定义一个函数,而是一个。与Haskell不同的是,F#并没有被懒惰地评估过,所以这个定义的整个主体在其范围开始的时候就会被执行一次,而不是每次调用它。如果你想定义一个函数,给它一些参数。如果你没有任何有意义的参数给它,使它成为一个单一unit值:但是

let main() : unit = 
    printfn "Hello World" 
    printfn "Goodbye World" 

输入和输出被限制它们隐含的约束,例如下面的代码。

let add1int arg = number+1 
let add1double arg = number+1.0 

功能add1int接受一个int并返回一个int。编译器知道这是因为arg的值被添加到另一个int。同样,add1double需要一倍,并返回一倍。

但是,如果你想显式声明你的输入和输出类型,而不是把它留给编译器(这可以增加一些地方的可读性)。

let add1int (number:int):int = number+1 
let add1double (number:double):double = number+1.0 
+2

只是为了澄清谁是不熟悉F#的语法OP的语法,每个参数的类型声明需要括号周围,并没有括号的类型声明(可以有一个最大的其中之一)的声明的类型该函数的返回值。例如,'let f(x:int):string'声明一个类型为'int - > string'的函数,'let g(c:char)(n:int):string'声明一个类型为'char - > int - > string'。 – rmunn