我目前正在阅读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
答案 0 :(得分:2)
参数tuple
不为空。这是调试器中的一个错误,有时您会遇到f#。
Here是一个dotnetfiddle,显示它不是空的。
变量prague0
被传递给函数。因此,函数中的tuple
与prague0
相同。
我在调试f#时发现这种情况很多次,当你在某些点检查this
时,这也变得相当奇怪。调试器确实面向c#
。 Watch语句也应该用c#
编写。
当您进一步检查事物时,您会注意到编译后的函数签名:withSecond<int,string,int>(int newItem2, string tuple_0, int tuple_1)
这解释了为什么调试器无法找到tuple
。如果您向tuple_0
添加一只手表,您会看到它包含"Prague"
。