繁体   English   中英

F#初学者在多个相关名称上使用let

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM