你能在F#中给出功能特定类型的签名吗?

时间:2017-10-12 21:03:34

标签: types f#

您好我已经开始学习F#了,我想知道您是否可以约束函数输入和输出的类型。

我试过这样做:

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

我还尝试在let之前将main放在第一行。都没有奏效。在F#中有没有办法做这种事情?我认为这是Haskell的一个很好的功能。

2 个答案:

答案 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