我刚刚开始使用F#和函数式编程。我想知道如何使用一个元组来定义第一个值必须是字符串,而不是标准的int。
示例:
复制字符串s
,n
次并返回它的函数。我现在拥有的是:
let rec pow2 = function
| (s:string,0) -> ""
| (s:string,n) -> s + pow2(s,n-1)
这很有效,但我认为有一种比在每种情况下定义s:string
更好的方法。
(我知道String.replicate
,这不是为了效果,而是学习)
答案 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
。