2016-06-21 2 views
3

Я пробовал MSDN example для функции Seq.choose (написанной ниже) как в файле .fsx, так и в интерактивном окне для Visual Studio, но он неоднократно возвращает ошибку FS0001, в которой указано, что опцией «Нет» является тип PageExt, а не тип абстрактного варианта ».F # Seq.choose() Ошибка FS0001

Я тщетно искал объяснение типа PageExt или почему это могло бы возвращать ошибку, когда ключевое слово None должно просто представлять параметр «no value» в выражении соответствия.

let numbers = seq {1..20} 
let evens = Seq.choose(fun x -> 
           match x with 
           | x when x%2=0 -> Some(x) 
           | _ -> None) numbers 
printfn "numbers = %A\n" numbers 
printfn "evens = %A" evens 
;; 

            | _ -> None) numbers 
    ---------------------------------------^^^^ 
> 

C:Path\stdin(38,40): error FS0001: This expression was expected to have type 
    'a option  
but here has type 
    PageExt 

Спасибо за любую помощь, которую любой может предложить!

+8

Это очень похоже на то, что у вас есть тип, называемый 'PageExt', где один случай объединения называется' None'. Щелкните правой кнопкой мыши в интерактивном окне, нажмите «Сбросить сеанс». –

ответ

8

Тип PageExt, вероятно, что-то, что вы втянули в текущую сессию FSI, которая раньше связывала что-то с None, по сути блокируя FSI от распознавания обычных типов опций.

В F # вы можете повторно использовать имена, которые «затеняют» исходное значение. Например, в ФСС, если вы напечатаете:

let a = 1;; 
let a = 2.3;; 
a;; 

Вы заметите, что он показывает:

val a : int = 1 

Тогда

val a : float = 2.3 

Наконец

val it : float = 2.3 

Это ISN Изменение значения a, но скорее определяет новое имя a, которое затеняет (или «скрывает») исходное значение привязки.

В вашем случае у вас есть имя None, которое связано с чем-то с типом PageExt, который затеняет Option.None, предотвращая его использование.

Самый простой способ исправить это - сбросить сеанс FSI. Щелкните правой кнопкой мыши в окне F # Interactive и выберите «Сбросить итеративный сеанс». Если вы это сделаете, запустите код, который вы вставили, он будет работать нормально.

+1

Право на цель. Спасибо! –

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