2015-06-09 2 views
1

Я пытаюсь использовать as-pattern для разложения значения кортежа, и я наблюдаю некоторое странное поведение синтаксического анализа/ввода. Пример FSI (4,0) пробег:Разбор/ввод шрифтов в F #

> let t = (0, (1, 2), 3) in let (_, (_, _) as pair, _) = t in();; 

    let t = (0, (1, 2), 3) in let (_, (_, _) as pair, _) = t in();; 
    -------------------------------------------------------^ 

stdin(9,56): error FS0001: Type mismatch. Expecting a 
    ('a * ('b * 'c)) * 'd 
but given a 
    int * (int * int) * int 
The type ''a * ('b * 'c)' does not match the type 'int' 

Однако пример работает, если я ставлю в некотором дополнительном():

> let t = (0, (1, 2), 3) in let (_, ((_, _) as pair), _) = t in();; 
val it : unit =() 

Является ли это мне быть немного ненормальным, или анализатор плохого поведения в первом пример? Я думаю, он пытается применить «как пару» к «, (, _)», что немного более жадно, чем кажется правильным.

ответ

4

, имеет более высокий приоритет, чем as, поэтому вам нужно дополнительное (, ) в

> let t = (0, (1, 2), 3) in let (_, ((_, _) as pair), _) = t in pair;; 
val it : int * int = (1, 2) 

вы можете увидеть это из ошибки:

stdin(9,56): error FS0001: Type mismatch. Expecting a ('a * ('b * 'c)) * 'd but given a int * (int * int) * int

он говорит вам, в основном, что неуместной некоторые скобки;)

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