F# 函数参数被 IDE 显示为 Null 但它有一个值

F# Function Parameter is Shown as Null by the IDE but it has a Value

我目前正在阅读 Real World Functional Programming,我对其中一个代码片段有疑问,即 3.10

这是一个处理模式匹配的例子。看看下面的截图,我不明白为什么在执行的那个点(那个断点)tuple是null:

据我了解,元组是传递给 withSecond 函数的参数。

如果有人能向我解释为什么该标识符此时应该具有空值,那就太好了。 干杯

编辑

添加代码:

let printCity(cityInfo) =
    printfn "Population of %s is %d."
            (fst cityInfo) (snd cityInfo)


let withSecond newItem2 tuple =
    let (originalItem1, originalItem2) = tuple // Decompose a tuple into two values
    (originalItem1, newItem2) // Use 'f' as a first and 'nsnd' as the second element

  // Increment population and print the new information
let prague0 = ("Prague", 1188000)
let prague1 = withSecond ((snd prague0) + 13195) prague0
printCity prague1

System.Console.ReadKey() |> ignore

参数 tuple 不为空。这是您有时使用 f# 运行 遇到的调试器中的一个错误。

Here 是一个 dotnetfiddle,表明它不为空。

变量prague0被传递给函数。所以函数内的 tupleprague0 相同。

我在调试 f# 时看到这种情况发生了很多次,当您在某些点检查 this 时,这也会变得相当奇怪。调试器真的是面向 c# 的。例如watch语句也应该写成c#

当您进一步检查时,您会注意到编译后的函数签名是:withSecond<int,string,int>(int newItem2, string tuple_0, int tuple_1) 这解释了为什么调试器找不到 tuple。如果您向 tuple_0 添加手表,您会看到它包含 "Prague".