简单的闭合功能

时间:2015-03-05 14:59:47

标签: f#

我有以下代码

let f2 x:int = 
    fun s:string ->
        match x with
        | x when x > 0 -> printfn "%s" s
        | _ -> printfn "%s" "Please give me a number that is greater than 0" 

编译器抱怨:

Unexpected symbol ':' in lambda expression. Expected '->' or other token. 

我做错了什么?

3 个答案:

答案 0 :(得分:4)

您必须在类型注释周围添加括号:

let f2 (x : int) = 
    fun (s : string) ->
        match x with
        | x when x > 0 -> printfn "%s" s
        | _ -> printfn "%s" "Please give me a number that is greater than 0" 

另外请注意,如果在示例中省略x周围的括号,这将意味着函数f2返回一个int,而不是将x的类型约束为int。


评论更新:

  

为什么我省略了围绕x的括号,这意味着函数f2会返回一个int?

因为这是指定函数返回类型的方式。

C#中的内容是什么:

ReturnTypeOfFunction functionName(TypeOfParam1 firstParam, TypeOfParam2 secondParam) { ... }

在F#中看起来像这样:

let functionName (firstParam : TypeOfParam1) (secondParam : TypeOfParam2) : ReturnTypeOfFunction =
    // Function implementation that returns object of type ReturnTypeOfFunction

可以找到更详细的解释on MSDN

答案 1 :(得分:4)

或者让编译器推断出类型。试试这个:

let f2 x = 
    fun s ->
        match x with
        | x when x > 0 -> printfn "%s" s
        | _ -> printfn "%s" "Please give me a number that is greater than 0" 

答案 2 :(得分:4)

您有两个相同问题的实例。定义函数时,将:*type*放在签名的末尾表示该函数返回该类型。在这种情况下,您表示您有一个函数f2,它接受​​一个参数并返回int。要修复它,您需要在注释周围加上括号。该语法不能在lambda中工作,所以你只需要编译错误。