1

下面我发布了导致问题的 F# 程序的片段。

...
match words with
        | name :: "of" :: context :: "=" :: value :: _ when Double.TryParse(value) |> fst ->
            let var = new FuzzyVariable(name, context, Double.Parse value)
            fuzzyVars <- var :: fuzzyVars

排队:

fuzzyVars <- var :: fuzzyVars

我收到“类型单元没有 null 作为正确值”错误。我对 F# 编程相当陌生,我不太清楚可能导致此问题的原因。

FuzzyVars 是 FuzzyVariable 列表类型。FuzzyVariable 是一种自定义类型。

编辑。

正如@Tomas Petricek 指出的那样,我的代码中有一行返回null:

| [] -> null

我的意图是忽略比赛的价值。正确的做法是:

| [] -> ()

更改后一切正常。

4

2 回答 2

3

如前所述,问题不在于您发布的代码段 - 看起来您的程序的其他部分使 F# 编译器认为表达式fuzzyVars <- var :: fuzzyVars应该具有承认的类型null(但事实并非如此,因为它返回unit) .

我能够通过编写得到同样的错误:

open System

type FuzzyVariable(a:string, b:string, c:float) =
  member x.A = ""
let mutable fuzzyVars : (FuzzyVariable list) = []
let words = [null; "of"; "context"; "="; "5"] 

主要部分:

null = (match words with
        | name :: "of" :: context :: "=" :: value :: _ when Double.TryParse(value) |> fst ->
            let var = new FuzzyVariable(name, context, Double.Parse value)
            fuzzyVars <- var :: fuzzyVars)

您的代码中可能没有类似的内容:-) 但错误消息可能会给您一个指向null来源的指针。在这里,我得到:

错误 FS0001:“单元”类型没有“空”作为正确值。另请参见 C:\Users\Tomas\AppData\Local\Temp\~vs648E.fsx(8,0)-(8,4)。

第 8 行字符 0 和 4 之间的代码就是null值!所以也许检查一下错误消息是否为您提供了更多信息?或者尝试在你的代码中寻找null其他地方......(这也可能是由一些意外的缩进引起的。)

于 2013-04-30T02:30:37.513 回答
1

我试过这个,它编译得很好:

open System
type test = {Name:string}
let mutable fuzzyVars : (test list) = []
match [null; "of"; "context"; "="; "5"] with
        | name :: "of" :: context :: "=" :: value :: _ when Double.TryParse(value) |> fst ->
            let var = {Name=name}
            fuzzyVars <- var :: fuzzyVars
        | a -> a |> ignore

问题不在这部分代码中。

于 2013-04-30T00:00:52.743 回答