类型单位没有null作为适当的值

时间:2013-04-29 23:10:18

标签: f#

下面我发布了导致问题的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是一种自定义类型。

EDIT。

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

| [] -> null

我的目的是忽略比赛的价值。正确的方法是:

| [] -> ()

在那次改变之后一切正常。

2 个答案:

答案 0 :(得分:3)

如前所述,问题不在于您发布的代码片段 - 看起来您的程序的其他部分使F#编译器认为表达式fuzzyVars <- var :: fuzzyVars应该具有允许{{1}的类型(但事实并非如此,因为它返回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) 来自哪里的指针。在这里,我得到:

  

错误FS0001:类型'unit'没有'null'作为适当的值。另请参阅C:\ Users \ Tomas \ AppData \ Local \ Temp \〜vs648E.fsx(8,0) - (8,4)。

字符0和4之间第8行的代码是null值!那么也许可以查看错误消息是否为您提供了更多信息?或者尝试在代码中的其他位置查找null ...(也可能是由于某些意外缩进造成的。)

答案 1 :(得分: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

问题不在这部分代码中。