2013-04-29 3 views
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 

Я получаю "Тип блока не имеет нуль в качестве надлежащего значения" ошибка. Я довольно новичок в программировании на F #, и я не совсем понимаю, что может вызвать эту проблему.

fuzzyVars имеет тип FuzzyVariable list. FuzzyVariable - это настраиваемый тип.

EDIT.

Как @Tomas Petricek указал, была линия в моем коде, который возвращается нуль:

| [] -> null 

Мое намерение состояло в том, чтобы игнорировать значение матча. Правильный способ сделать это:

| [] ->() 

После этого все работает нормально.

+0

@mydogisbox Это ошибка компиляции. –

+0

О, хе-хе, так и есть. – mydogisbox

+0

'fuzzyVars <- var :: fuzzyVars' возвращает тип единицы. Что вы делаете с возвращаемым значением матча? – mydogisbox

ответ

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: Тип «unit» не имеет «null» в качестве правильного значения. См. Также C: \ Users \ Tomas \ AppData \ Local \ Temp \ ~ vs648E.fsx (8,0) - (8,4).

И код в строке 8 между символом 0 и 4 является значением null! Поэтому, возможно, проверьте, дает ли сообщение об ошибке дополнительную информацию? Или попробуйте найти null в другом месте вашего кода ... (Возможно, это также вызвано неожиданным отступом.)

+0

Пятно на! Была строка, которая вернула null: | [] -> null. –

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 

Проблема не в этом разделе кода.

+0

Инициализация выглядит следующим образом: let mutable fuzzyVars: (FuzzyVariable list) = [] –

+0

Есть ли в вашей ошибке (в окнах ошибок) мало стрелок, указывающих на проблему (как, например, выше)? – mydogisbox

+0

Можете ли вы опубликовать некоторые подробности о том, как вы объявляете 'FuzzyVariable'? – mydogisbox

Смежные вопросы