您好我已经开始学习F#了,我想知道您是否可以约束函数输入和输出的类型。
我试过这样做:
main : unit
let main = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n")
let _ = main
我还尝试在let
之前将main
放在第一行。都没有奏效。在F#中有没有办法做这种事情?我认为这是Haskell的一个很好的功能。
答案 0 :(得分:4)
是的,这完全有可能:
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"
答案 1 :(得分:1)
输入和输出受约束但是它们被隐式约束,例如以下代码。
let add1int arg = number+1
let add1double arg = number+1.0
函数add1int
接受一个int并返回一个int。编译器知道这一点,因为arg的值被添加到另一个int。同样地,add1double
采用double并返回double。
但是,如果要显式声明输入和输出类型而不是将其留给编译器(这可以提高某些地方的可读性)。
let add1int (number:int):int = number+1
let add1double (number:double):double = number+1.0