功能包装问题:X <|乐趣()->一个
所以我只是想问为什么这有效:
let internal X th =
foo()
th()
bar()
let Start() =
X <| fun () -> ( foo(); bar(); etc... )
这不起作用:
let internal XD A =
let X th =
foo()
th()
bar()
(X <| fun () -> A)
let Start() =
XD ( foo(); bar(); etc... )
它对我来说看起来是一样的,但第一个变体作为包装器工作,我完全不明白第二个变体是如何工作的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为令人困惑的是,在您的第二个版本中,变量
A
只是一个unit
。 F# 编译器根据以下事实推断这一点:您从用作th
的函数返回A
,并且th
的类型为unit ->单位。这意味着在单步执行
XD
之前,会在Start
中调用foo
。然而,很难说出您期望的结果是什么。您是否想将
foo
作为函数传递给XD
,而不是立即调用它?如果是,那么您需要:I suppose that the confusing thing is that in your second version, the variable
A
is just aunit
. The F# compiler infers this from the fact that you returnA
from a function that's used asth
and the type ofth
isunit -> unit
. This means thatfoo
is called inStart
before stepping inXD
.However, it is a bit difficult to tell what results were you expecting. Did you want to pass
foo
toXD
as a function, instead of calling it immediately? If yes, then you'd need:以下是您想要实现的第二个版本的正确代码(不使用惰性值的 lambda)。
The below is the correct code for 2nd version for what you want to achieve (without lambda using lazy values).