math - F#中的阴影
问题描述
我想知道为什么 F# 允许阴影,特别是在同一范围内。
我一直认为纯函数式编程结构中的值绑定类似于代数/数学中的赋值。
例如,
y = x + 1
将是一个有效的数学表达式,但
y = y + 1
不会的。
然而,因为有阴影,
let y = y + 1
是 F# 中完全有效的表达式。
为什么语言允许这样做?
解决方案
对此最正确的答案是因为创建者 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# 中应用阴影时要仔细考虑。
推荐阅读
- python - python列表中的重复条目
- html - 在 django 模板中改变云图像
- android - Capacitor v3 一些错误
- hybris - 我如何在 Backoffice config.xml 动态中只读属性
- html - CSS - 对象不在一行中
- javascript - 如何滚动超出 React 中的焦点元素
- python - 如果使用变量值等于 1
- java - 消费者属性 spring cloud 和 kafka binder
- pine-script - Pine 脚本 - 在“show_last”内乘法时出现问题
- java - 带有 aws lambda 处理程序的黄瓜测试配置