F#中的阴影

问题描述 投票:0回答:1

我想知道为什么F#允许阴影,尤其是在同一范围内。

我一直认为纯函数式编程构造中的值绑定类似于代数/数学中的赋值。

例如,

y = x + 1

将是有效的数学表达式,但

y = y + 1

不会。

但是,由于阴影,

let y = y + 1

在F#中是一个完全有效的表达式。

为什么语言允许这样做?

math f# algebra purely-functional shadowing
1个回答
0
投票

最正确的答案是因为创建者Don Syme认为这是添加到该语言中的有用功能。

不过有一些很好的用途。一种是使用F#样式的可选参数:

type C() =
    member _.M(?x) =
        let x = Option.defaultValue 0 x
        printfn "%d" x

F#可选参数是选项,它带来高度的正确性和一致性。但是,假设一个方法有3个或更多可选参数。必须为它们每个重新绑定值并为它们使用不同的名称会很烦人!这是方便阴影处理的区域。

在编写递归子例程时也很方便。考虑以下sum的简单实现列表:

let mySum xs =
    let rec loop xs acc =
        match xs with
        | [] -> acc
        | h :: t -> loop t (h + acc)
    loop xs 0

由于阴影,我不需要为内部循环重新绑定xs。由于它是通用名称,因此xs的名字差不多可以用,所以对于内部循环必须使用其他名称会很烦人。

不过,阴影并不是全部好消息。如果不小心,来自open声明的类型可能会遮盖先前声明的类型的类型。这可能会造成混淆。 F#编辑器工具可以将绑定与阴影中的绑定区分开,但是纯文本不能做到这一点。因此,最重要的是:在F#中应用阴影时要仔细考虑。

© www.soinside.com 2019 - 2024. All rights reserved.