【问题标题】: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