你可以在F#中给函数特定的类型签名吗?
问题描述:
嗨我已经开始学习F#,我在想你是否可以限制函数的输入和输出的类型。你可以在F#中给函数特定的类型签名吗?
我试着这样做:
main : unit
let main = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n")
let _ = main
,我也试图把let
main
之前的第一道防线。都没有工作。有没有办法在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
只是为了澄清谁是不熟悉F#的语法OP的语法,每个参数的类型声明需要括号周围,并没有括号的类型声明(可以有一个最大的其中之一)的声明的类型该函数的返回值。例如,'let f(x:int):string'声明一个类型为'int - > string'的函数,'let g(c:char)(n:int):string'声明一个类型为'char - > int - > string'。 – rmunn