如何在函数中定义元组中的类型

时间:2013-02-01 01:51:22

标签: .net f# functional-programming

我刚刚开始使用F#和函数式编程。我想知道如何使用一个元组来定义第一个值必须是字符串,而不是标准的int。

示例:

复制字符串sn次并返回它的函数。我现在拥有的是:

let rec pow2 = function
    | (s:string,0) -> ""
    | (s:string,n) -> s + pow2(s,n-1)

这很有效,但我认为有一种比在每种情况下定义s:string更好的方法。

(我知道String.replicate,这不是为了效果,而是学习)

3 个答案:

答案 0 :(得分:7)

实际上,这里不需要类型注释。第一个模式匹配中的""返回值足以为编译器提供足够的提示:

> let rec pow2 = function
    | (s,0) -> ""
    | (s,n) -> s + pow2(s,n-1);;

val pow2 : string * int -> string

答案 1 :(得分:4)

你只需要在第一种情况下使用类型注释 - 在其他情况下,F#编译器可以推断元组的第一个元素必须是string

let rec pow2 = function
    | (s:string,0) -> ""
    | (s,n) -> s + pow2(s,n-1)

这只是一种风格问题,但如果您编写这样的函数,我认为它更容易阅读:

let rec pow2 (s, n) =
    match n with
    | 0 -> ""
    | _ -> s + pow2(s, n-1)

答案 2 :(得分:4)

您也可以这样做,其中元组的类型在函数定义中给出:

let rec pow2 ((s, n) : string * int) =
    match n with
    | 0 -> ""
    | _ -> s + pow2 (s, n - 1)

请注意,元组的元素在显式类型注释中由*分隔。另外,正如斯蒂芬指出的那样,在这个例子中,类型推断系统将足够聪明,可以找出元组的类型,因为我们将n与整数匹配,因为我们添加了一个字符串(""s