Почему ocaml дает ошибку слишком много аргументов? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть следующий код:

type value =    (* an integer or an error message *)                                                                                    
  | Value of int                                                                                                                        
  | Error of string;;  

let rec compare_v (lo: value) (ro: value) : value =                                                                                         
  match lo with                                                                                                                         
  | Value(l) ->                                                                                                                         
     match ro with                                                                                                                      
     | Value (r) -> if l == r then Value(1) else Value(-1)  

И работает compare_v Value(9) Value(10);; дает:

Line 1, characters 0-9:                                                                                                                                                                                                                                                                                                       
1 | compare_v Value(9) Value(10);;                                                                                                                                                                                                                                                                                            
    ^^^^^^^^^                                                                                                                                                                                                                                                                                                                 
Error: This function has type value -> value -> value                                                                                                                                                                                                                                                                         
       It is applied to too many arguments; maybe you forgot a `;'.       

Почему это так?

1 Ответ

1 голос
/ 16 октября 2019

Синтаксический анализ этого подвыражения:

compare_v Value(9) 

Примерно так:

(compare_v Value) (9)

В приложении функции OCaml обозначается просто сопоставлением (помещая два выражения рядом),и это остается ассоциативным. В этом выражении у вас есть три выражения рядом:

compare_v  Value   (9)

Левая ассоциативность дает результат, который вы видите.

Что вы должны написать:

compare_v (Value 9)

В OCaml вам нужно использовать круглые скобки иначе, чем в основных (Algolic) языках. В частности, скобки не имеют ничего общего с вызовом функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...