Function 模式匹配F中的类型值时返回整数值#

Function 模式匹配F中的类型值时返回整数值#,function,f#,pattern-matching,Function,F#,Pattern Matching,这个模式匹配函数可以很好地处理字符串,但是当我试图将其转换为比较自定义类型值时,VisualStudio表示该函数尚未完成,即使语法完全相同 let Greeting name = match name with | "Joe" | "Bob" | "Ray" -> "Hello" | "Miguel" | "Jose" -> "Hola" | _ -> "Don't know what to say" Visual studio建议添加一个

这个模式匹配函数可以很好地处理字符串,但是当我试图将其转换为比较自定义类型值时,VisualStudio表示该函数尚未完成,即使语法完全相同

let Greeting name = 
    match name with
    | "Joe" | "Bob" | "Ray" -> "Hello"
    | "Miguel" | "Jose" -> "Hola"
    | _ -> "Don't know what to say"

Visual studio建议添加一个显式结果,因此我添加了一个通配符(尽管这应该是不必要的,因为如果没有秩集afaik,就无法创建卡对象),但错误仍然存在。

您在评论中说,您收到的错误消息如下所示:

此“let”后面的块未完成。每个代码块都是一个表达式,必须有一个结果。”let'不能是块中的最终代码元素。考虑给这个块一个明确的结果。< /P> 这与您的
匹配
表达式无关,您可以安全地删除
->0
行。您看到这个错误是因为在代码块中的某个地方有一个
let
语句,后面没有另一个表达式。即,本规范不合法:

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
F#中的所有函数都必须返回一个值,
let
语句是F#中为数不多的语句之一,它是一个语句,而不是一个表达式<代码>让不返回值。因此,当您在代码块中时,必须使用其他表达式跟随
let
语句,以便返回值的内容是函数的最后一个表达式。即:

let f x =
    let result = x + 5
这是合法的

请注意,这不适用于模块级别。模块是包含值的“容器”,本身没有值。(基本上,它们被编译成静态类)。所以这很好:

let f x =
    let result = x + 5
    result

let
语句作为模块中的最后一行是完全可以的(事实上,这是正常的)。但它可能不是函数(或任何其他代码块)中的最后一行,因为函数必须返回一个值。

我无法重现这一点。当我在Visual Studio中加载您的卡匹配代码时,它告诉我,
->0
行将永远不会匹配。如果我删除通配符,它不会给出任何错误——但是如果我随后删除其中一个匹配项(如
Six->6
行),我会被告知该匹配项不完整:“例如,值'Six'可能表示模式未涵盖的情况。”当您说“Visual Studio建议添加显式结果”时,您得到的确切错误消息是什么?代码的哪个部分产生了错误消息(例如,波浪形下划线显示在哪里)?另外,您使用的是哪个版本的Visual Studio和Visual F#Tools?@rmunn我使用的是Visual Studio 2017 enterprise和F#core 4.4.1.0,它给我的错误是“此“let”后面的块未完成。每个代码块都是一个表达式,必须有一个结果。”let'不能是块中的最终代码元素。考虑给这个块一个明确的结果。触发它的代码是cardValue函数开头的“let”。该错误与
match
表达式无关。只是
let
语句可能不是函数中的最后一个表达式。我会写一个更详细的答案。但是当我这么做的时候,你能粘贴你的实际代码吗?因为到目前为止您显示的代码是完全正确的,并且无法生成错误消息;你至少遗漏了一件事。我打赌你的实际代码看起来像
let something=match card.rank with…
,你省略了
let something=
部分,以简化示例代码。在这种情况下,我正在编写的答案可能是不必要的(因为你可能刚刚解决了问题)。。。但无论如何,为了其他发现这个问题的人,我会把它做完的。
module Foo =
    let f x = x + 1
    let value = 26