【问题标题】:How do you define types in a tuple in a function如何在函数的元组中定义类型
【发布时间】:2023-03-28 00:37:01
【问题描述】:

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

例子:

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

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

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

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

【问题讨论】:

    标签: .net f# functional-programming


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您只需要在第一种情况下使用类型注释 -- 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)
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-16
          • 1970-01-01
          • 2022-06-28
          • 2020-12-27
          • 2019-05-30
          相关资源
          最近更新 更多