与“:?输入名称”匹配的F#类型:为什么我们需要一个新名称?

问题描述:

我一直在寻找的模式在F#类型匹配语法描述如下:与“:?输入名称”匹配的F#类型:为什么我们需要一个新名称?

http://msdn.microsoft.com/de-de/library/dd547125.aspx#sectionToggle14

实例从该页面(略有修改):

open System.Windows.Forms 

let RegisterControl (control: Control) = 
    match control with 
    | :? Button as button -> button.Text <- "Registered." 
    | :? CheckBox as checkbox -> checkbox.Checked <- false 
    | _ ->() 

我不明白的是为什么我们需要引入一个新名称(“button”,“checkbox”)以及类型检查。如果匹配成功,编译器应该知道“控制”具有所需的类型,并可以在下面的表达式/语句中对其进行相应处理。换句话说,我为什么不能做到这一点:

open System.Windows.Forms 

let RegisterControl (control: Control) = 
    match control with 
    | :? Button -> control.Text <- "Registered." 
    | :? CheckBox -> control.Checked <- false 
    | _ ->() 

这将是类似"type guard" feature in TypeScript 1.4

F#有没有这么好的理由? (注:我运行VS 2012)

一个明显的原因,你需要一个新的名字时match参数是一个表达式:

match some.Method() with 
| :? Button -> // What to do here?? 

当然,语言可以支持的符号。在这种情况下,没有技术上的原因可能导致你无法做到这一点,但我认为不这样做的逻辑理由是相当好的。

F#中的每个值都有一个显式声明的位置(当你使用一个值时,你总是可以定义)。这将使用这个简化:? Type语法来定义的值不会真的有什么声明

  • 你可以说,他们在那里的原始变量声明点声明,但这是错误的 - 因为,它会有不同的类型。

  • 或者你可以说它们是以某种“隐藏的方式”来声明的,但是这会给这个语言带来一个全新的概念。

这就是说,我可以看到为什么语法是好的和有用的。但它似乎与F#中变量的工作原理并不相符。

+0

确实,这是非常明显的。猜猜我太专注于例子。谢谢。 – 2014-11-22 18:37:33

+0

示例驱动的语言设计:-) – 2014-11-22 19:20:49

+1

示例驱动的语言理解,不可避免地带有愚蠢的问题:)我不会仅仅基于示例进入语言设计,承诺。 – 2014-11-23 16:16:40

这将为不一致的模型交易一致的模型。

您需要引入一个新名字并不完全正确。这工作得很好:

match control with 
| :? Button -> doButtonyStuff control 
| :? CheckBox -> doCheckBoxyStuff control 
| _ ->() 

当然除了你control值保持在比赛中的情况下机构中Control。只有当您想要在匹配模式中进行类型检查(C#风格is)和演员表(C#风格as)时才会引入该名称。

你的建议可以很容易地想象为在演员投入后你有一个隐含的暗影control: Control你在与另一个control: Button的比赛中使用。我看到的一个问题是,它具有使control: Control在匹配案例主体中不可访问的副作用。这在你的特定例子中可能不是什么大问题,但是如果你检查接口类型,它可能会变得笨拙。

没有模式匹配结构今天做这样一个隐含的事情。除非你自己这样做,否则你的绑定不会被遮蔽。如果你问我,这很好。显式比隐式更好。

+0

我认为接口的情况并不是问题,因为.NET泛型具有类似的语义:可以将类型参数约束为任意类型并实现多个接口,编译器将处理根据请求的使用情况,键入为类型或界面之一。 – 2014-11-23 16:22:36

+0

这肯定比Button vs Control示例更具问题。在F#接口中只有显式实现,因此要访问需要转换为接口类型的接口方法(此时不再可以访问非接口方法,则需要转换回具体类型)。按钮可能会重新呈现Control提供的所有重要内容,所以这会减少痛苦。 – scrwtp 2014-11-23 17:57:40