gpt4 book ai didi

f# - 为什么一个变量可以在一个模式中绑定(bind)两次?

转载 作者:行者123 更新时间:2023-12-03 14:22:33 25 4
gpt4 key购买 nike

通常,F# 不允许模式变量在同一模式中出现两次。但是在下面的代码中,F# 没有提示——这是一个错误吗?

type foo = { A: int }
let test (x, {A = x}) = x
let result = test ("bla", {A = 3})

最佳答案

我不认为这是一个错误,虽然它看起来令人困惑,但这只是编译器编译上述值绑定(bind)的方式。

第 14.6.3 节指出,如果值定义不是单值模式(如这里的情况),则详细表达式为

tmp <typars1… typarsn> = expr
ident1 <typars1> = expr1

identn <typarsn> = exprn

其中 tmp 是一个新的标识符,每个 expri 都是根据输入 tmp [来自 spec 的模式 pat (§7) 的编译结果。 ]。

要查看编​​译器做了什么,我们可以使用 F# 引号,例如:
<@ let test (x:int, {A = x:int})= x in test (3, {A = 5}) @>;;

在字符串格式中,我得到(留下一些东西):
Let (test,
Lambda (tupledArg,
Let (x, TupleGet (tupledArg, 0),
Let (_arg1, TupleGet (tupledArg, 1),
Let (x, PropertyGet (Some (_arg1), A, []), x)))),
Application (test, NewTuple (Value (3), NewRecord (foo, Value (5)))))

这就是为什么我们得到“内部”x。

我不认为这是一个错误,但如果这会产生警告,它可能会更加一致。

关于f# - 为什么一个变量可以在一个模式中绑定(bind)两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com