【发布时间】:2017-04-21 01:58:43
【问题描述】:
let Greeting name =
match name with
| "Joe" | "Bob" | "Ray" -> "Hello"
| "Miguel" | "Jose" -> "Hola"
| _ -> "Don't know what to say"
此模式匹配函数与字符串完美匹配,但当我尝试将其转换为比较自定义类型值时,Visual Studio 显示该函数未完成,即使语法完全相同。
type Suit = Spades | Clubs | Hearts | Diamonds
type Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King
type Card = { suit: Suit; rank: Rank}
let cardValue (card:Card) =
match card.rank with
| Ace -> 1
| Two -> 2
| Three -> 3
| Four -> 4
| Five -> 5
| Six -> 6
| Seven -> 7
| Eight -> 8
| Nine -> 9
| Ten | Jack | Queen | King -> 10
| _ -> 0
Visual Studio 建议添加一个明确的结果,所以我添加了一个通配符(尽管它应该是不必要的,因为没有等级集 afaik 就无法创建卡片对象)但错误仍然存在。
【问题讨论】:
-
我无法重现这个。当我在 Visual Studio 中加载您的卡片匹配代码时,它告诉我
_ -> 0行将永远不会匹配。如果我删除通配符,它不会给出任何错误 - 但如果我随后删除其中一个匹配项(如Six -> 6行),我被告知匹配不完整:“例如,值 'Six' 可能表示模式未涵盖的情况。” -
当您说“Visual Studio 建议添加显式结果”时,您收到的 precise 错误消息是什么?代码的哪一部分产生了错误消息(即波浪下划线出现在哪里)?另外,您使用的是哪个版本的 Visual Studio 和 Visual F# 工具?
-
@rmunn 我正在使用 Visual Studio 2017 企业版和 f# core 4.4.1.0,它给我的错误是“这个 'let' 后面的块未完成。每个代码块都是一个表达式和必须有结果。'let'不能是块中的最后一个代码元素。考虑给这个块一个明确的结果。触发它的代码是 cardValue 函数开头的“let”。
-
啊。该错误与
match表达式无关。只是let语句可能不是 是函数中的最后一个表达式。我会写一个更详细的答案。但是当我这样做的时候,你能粘贴你的实际代码吗?因为到目前为止您显示的代码是完全正确的,并且无法产生该错误消息;您必须至少遗漏一件事。我敢打赌你的实际代码看起来像let something = match card.rank with ...,你省略了let something =部分以使示例代码更简单。 -
在那种情况下,我写的答案可能是不必要的(因为你可能刚刚发现了你的问题)......但为了其他人,我还是会完成它找到这个问题。
标签: function f# pattern-matching