2013-02-01 26 views
2

我刚刚开始使用F#和函数式编程。我想知道我怎么可以做一个函数采取一个元组,我定义第一个值必须是一个字符串,而不是标准的int。如何在函数中定义元组中的类型

实施例:

能够复制一个字符串,sn倍,并返回它的函数。我现在所拥有的是这样的:

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

这工作,但我认为没有比定义s:string任何情况下更好的办法。

(我知道String.replicate,这是不适合的效果着想,而是学习)

回答

7

事实上,没有类型标注在这里需要。在第一个模式匹配的""返回值是编译器足够足够提示:

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

val pow2 : string * int -> string 
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) 
4

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

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

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

相关问题