【问题标题】:Why is F# suddenly returning values from functions as @+ the line number?为什么 F# 突然从函数返回值作为 @+ 行号?
【发布时间】:2011-10-20 06:55:39
【问题描述】:

我在 F# 中有一些运行良好的代码,但现在任何函数都返回带有 @ + 行号的 let 绑定的名称?所以在我做这样的事情之前:

let sqlData = GetSummary 2011

我会得到数据。现在我得到 sqlData@160 作为返回类型,它破坏了其他期望特定类型的函数。任何关于为什么突然开始发生这种情况的帮助将不胜感激。

更新: 所以我把 GetSummary 代码改成这样,看看会发生什么:

 let GetSummary fiscalYear =
    let g = 22
    g

什么都没有改变。我得到了完全相同的结果,即使我有一个断点,它也不会中断函数。它也不会进入 GetSummary。为什么它会忽略某些功能而不忽略其他功能?

【问题讨论】:

  • 你能贴出GetSummary的代码吗?
  • 我的猜测是,它开始推断出与您预期不同的类型,并且这些类型正在以令人惊讶的方式在您的程序中传播。
  • Get Summary 调用其他一些从 SQL Server 返回数据的函数以及自定义类型。甚至其他基本功能也没有正确返回,然后其他的会。我不确定为什么。 Gabe,不,它没有错误地推断类型,它正在将返回类型更改为不存在的 sqlData@160。奇怪的是它不会单步执行 GetSummary 函数。这就像它为代码放置一个书签。懒惰的执行坏了?
  • Gist 上发布整个代码并链接到它。 某事已关闭。

标签: .net f#


【解决方案1】:

我的猜测是您在 GetSummary 函数中进行了更改,因此它实际上返回了一个函数而不是返回数据(当您给它一个参数时)。例如,这个 sn-p 的行为有点相似——它返回一些内部的东西,它不会进入 bar 函数:

> let bar n = printfn "inside bar"; n + 1;;
val bar : int -> int

> let foo n = bar;; // This takes 'n' and returns a function..
val foo : 'a -> (int -> int)

> printfn "%O" (foo 10);; // Here, we call 'foo', but the result is a function!
FSI_0016+it@15-3

【讨论】:

  • Tomas,这是可能的,但是如果您看到我在上面的编辑,我更改了函数并得到了相同的行为。编译器没有重新编译吗?我真的被难住了!
【解决方案2】:

好吧,现在我觉得我真的很愚蠢。回过头才发现原来是把GetSummary的定义改成了

GetSummary name fiscalYear

由于我没有传入名称,它认为我正在对函数进行柯里化,因此出现了奇怪的行为。

感谢您的意见!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 2014-02-14
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多