[英]F# beginner using let on multiple dependent names
我讨厌问这样一个菜鸟问题,但是我在网上寻觅高潮和低谷-这实际上是我的第一天。
以下VBA摘录分配了两个变量,其中第一个变量馈入第二个变量(此代码来自www.spreadsheetadvice.com):
If zabs <= 12.7 Then
...
If zabs <= 1.28 Then
Temp = y + a3 - a4 / (y + a5 + a6 / (y + a7))
Q = a0 - zabs * (a1 - a2 * y / Temp)
Else
Temp = (zabs - b5 + b6 / (zabs + b7 - b8 / (zabs + b9 + b10 / (zabs + b11))))
Q = pdF / (zabs - b1 + (b2 / (zabs + b3 + b4 / Temp)))
End If
Else ...
我正在尝试在F#中复制它-不使用可变变量。 这有效:
let Temp =
if zabs <= 1.28 then
y + a3 - a4 / (y + a5 + a6 / (y + a7))
elif zabs <= 12.7 then
(zabs - b5 + b6 / (zabs + b7 - b8 / (zabs + b9 + b10 / (zabs + b11))))
else
0.0
let Q =
if zabs <= 1.28 then
a0 - zabs * (a1 - a2 * y / Temp)
elif zabs <= 12.7 then
pdF / (zabs - b1 + (b2 / (zabs + b3 + b4 / Temp)))
else
0.0
但是我不喜欢分离两个相关变量-或重复If语句。 这是行不通的,但与我来的差不多:
let Temp, Q =
if zabs <= 1.28 then
y + a3 - a4 / (y + a5 + a6 / (y + a7)),
a0 - zabs * (a1 - a2 * y / Temp)
elif zabs <= 12.7 then
(zabs - b5 + b6 / (zabs + b7 - b8 / (zabs + b9 + b10 / (zabs + b11)))),
pdF / (zabs - b1 + (b2 / (zabs + b3 + b4 / Temp)))
else
0.0,
0.0
我花了一段时间才弄清楚第3、6和9行上的逗号(如果它们实际上是正确的)。 但是编译器认为我在分配它之前尝试使用Temp。 我假设或希望我只是想念一个简单的成语。
这有效:
let Temp, Q =
if zabs <= 1.28 then
let temp = y + a3 - a4 / (y + a5 + a6 / (y + a7))
let q = a0 - zabs * (a1 - a2 * y / temp)
temp, q
elif zabs <= 12.7 then
let temp = (zabs - b5 + b6 / (zabs + b7 - b8 / (zabs + b9 + b10 / (zabs + b11))))
let q = pdF / (zabs - b1 + (b2 / (zabs + b3 + b4 / temp)))
temp, q
else
0.0, 0.0
我花了一段时间才弄清楚第3、6和9行上的逗号(如果它们实际上是正确的)。 但是编译器认为我在分配它之前尝试使用Temp。 我假设或希望我只是想念一个简单的成语。
是的,您缺少该语言的基础知识,必须使用逗号,因为您声明了一个tuple
因此必须绑定一个'a * 'b
类型的值
我建议使用模式匹配 ,这是F#(和其他功能语言)功能更强大的功能之一-https: //msdn.microsoft.com/zh-cn/library/dd547125.aspx
let yourfunc zabs =
match zabs with
| x when x <= 1.28 -> let temp = y + a3 - a4 / (y + a5 + a6 / (y + a7))
let q = a0 - zabs * (a1 - a2 * y / temp)
temp, q
| x when x <= 12.7 -> let temp = (zabs - b5 + b6 / (zabs + b7 - b8 / (zabs + b9 + b10 / (zabs + b11))))
let q = pdF / (zabs - b1 + (b2 / (zabs + b3 + b4 / temp)))
temp, q
| _ -> 0.0,0.0
我认为我犯了一个简单的错误:因为Temp是临时的并且从属于Q,所以Temp应该在Q声明的局部范围内声明,而不是与Q相等的范围。根据这一点,我认为使用If和使用“匹配”同样有效。 但是Match可能更惯用了(感谢Alessandro)。 正是如此:
let Q =
match zabs with
| i when i <= 1.28 ->
let Temp = y + a3 - a4 / (y + a5 + a6 / (y + a7))
a0 - zabs * (a1 - a2 * y / Temp)
| i when i <= 12.7 ->
let Temp = (zabs - b5 + b6 / (zabs + b7 - b8 / (zabs + b9 + b10 / (zabs + b11))))
pdF / (zabs - b1 + (b2 / (zabs + b3 + b4 / Temp)))
| _ ->
0.0
所以现在我注定要做出两个声明,它们确实需要在不久的将来具有相同的范围,然后再次回到类似的情况...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.