Types 你能用F#给函数特定的类型签名吗?

Types 你能用F#给函数特定的类型签名吗?,types,f#,Types,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 "He

嗨,我已经开始学习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")
此外,还有几个要点:

首先,您可以使用
printfn
而不是最后的
\n

其次,lambda表达式中的
x
是冗余的,lambda表达式本身也是冗余的。要对多个调用进行排序,只需按顺序列出它们,每一个都在新行上(或用分号分隔):

第三,这样你就不是定义一个函数,而是定义一个值。与Haskell不同的是,F#不是惰性地计算的,因此这个定义的整个主体将在其范围开始时执行一次,而不是每次调用它。如果你想定义一个函数,给它一些参数。如果没有任何有意义的参数,请将其设置为单个
单位
值:

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
接受一个double并返回一个double

但是,如果您希望显式声明输入和输出类型,而不是将其留给编译器(这可能会增加某些地方的可读性)


为了澄清不熟悉F#语法的OP的语法,每个参数的类型声明都需要括号,没有括号的类型声明(最多可以有一个)声明函数返回值的类型。例如,
let f(x:int):string
声明类型为
int->string
的函数,
let g(c:char)(n:int):string
声明类型为
char->int->string
的函数。
let add1int arg = number+1
let add1double arg = number+1.0
let add1int (number:int):int = number+1
let add1double (number:double):double = number+1.0