【问题标题】:F# pattern matching problem?F#模式匹配问题?
【发布时间】:2011-02-21 05:04:18
【问题描述】:

我在使用 F# 进行模式匹配时遇到问题。我正在构建一个 F# 库,目前为止:

namespace parser
    module parse =
        let public y = function 
        | x when x.Contains("hi") -> "HELLO" 
        | x when x.Contains("hello") -> "HI" 
        | x -> x

但它给了我错误:错误查找基于此程序点之前的信息的不确定类型的对象。在这个程序点之前可能需要一个类型注释来约束对象的类型。这可能会解决查找问题。

【问题讨论】:

标签: f# pattern-matching type-inference


【解决方案1】:

本质上,编译器不理解您希望函数的参数为​​string 类型。基本上,您不能在隐式声明的函数参数上调用实例方法。您需要使用类似以下的内容。

let y (value:string) = 
  match value when
  | x when x.Contains("hi") -> "HELLO" 
  | x when x.Contains("hello") -> "HI" 
  | x -> x

有趣的是,如果您不调用实例方法,而是以其他方式使用它(类型已知),您会没事的。换句话说,假设一个StringUtils 模块包含一个方法Has,它接受两个字符串并执行与Contains 相同的检查;如果是这样,您可以使用隐式参数,因为编译器已经知道该值必须是哪种类型。

  module StringUtils =
    let has (word:string) value = word.Contains(value)

  module Parse =
    let y = function 
     | x when x |> StringUtils.has "hi" -> "HELLO" 
     | x when x |> StringUtils.has "hello" -> "HI" 
     | x -> x

显然,在许多情况下,这类事情是不必要的冗长。但它展示了关于 F# 的类型推断行为的更重要的一点。

【讨论】:

    【解决方案2】:

    编译器想知道x 的类型在您的y 函数中,因此您需要对其进行注释,如下所示:

    let y (x: string) =
      match x with
      | x when x.Contains "hi" -> "HELLO"
      | x when x.Contains "hello" -> "HI"
      | x -> x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 2011-06-17
      • 2020-07-05
      • 1970-01-01
      相关资源
      最近更新 更多