2

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

例子:

复制字符串s,n次并返回它的函数。我现在拥有的是这样的:

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

这行得通,但我认为有比定义s:string每个案例更好的方法。

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

4

3 回答 3

7

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

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

val pow2 : string * int -> string
于 2013-02-01T02:06:02.223 回答
4

您只需要在第一种情况下使用类型注释——F# 编译器可以推断string在其余情况下元组的第一个元素必须是 a。

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)
于 2013-02-01T02:06:17.627 回答
4

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

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

请注意,元组的元素*在显式类型注释中被分隔。此外,正如 Stephen 所指出的,在这个例子中,类型推断系统将足够聪明,可以找出元组的类型,因为我们匹配n一个整数,并且我们添加了一个字符串 ( "") s

于 2013-02-01T21:32:55.547 回答