F#函数参数由IDE显示为Null,但它具有值

时间:2015-03-27 05:42:43

标签: f#

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

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

enter image description here

据我所知,元组是一个传递给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

1 个答案:

答案 0 :(得分:2)

参数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"

function signature watches