下面我发布了导致问题的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
我的目的是忽略比赛的价值。正确的方法是:
| [] -> ()
在那次改变之后一切正常。
答案 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
问题不在这部分代码中。