«Значение не является функцией и не может быть применено».ошибка в F # - PullRequest
3 голосов
/ 24 августа 2011

Я пытался запустить следующий FParsec код, пока по какой-то причине он не перестал работать:

enter image description here

Я получаю ошибку

"The value is not a function and cannot be applied."

Если я закомментирую последнюю строку кода (test ns ".."), это не приведет к ошибке.Любые мысли о том, как решить эту проблему?


Исходный код в текстовом виде следующий:

open System
open FParsec

let test p str =
    match run p str with
    | Success(result, _, _)   -> printfn "Success: %A" result
    | Failure(errorMsg, _, _) -> printfn "Failure: %s" errorMsg

type Namespace = { Name : string; Classes : string list; }

let classes : Parser<string list, unit> = 
  many (spaces >>. many1Satisfy isLetter .>> spaces)

let ns =
  pipe2 
    (spaces >>. skipString "namespace" >>. spaces >>. many1Satisfy isLetter)
    (spaces >>. skipString "{" >>. classes .>> skipString "}")
    (fun name classes -> { Name = name; Classes = classes } )

test ns "namespace abc { def ghi }"

Ответы [ 2 ]

4 голосов
/ 24 августа 2011

Никто не мог бы угадать ответ здесь.Проблема заключалась в другом, что я решил исключить из поста: сам заголовок моего файла:

#if INTERACTIVE
    #r @"C:\Users\xyz\Desktop\fparsec-main-default\Build\VS10\bin\Debug\FParsecCS.dll";
    #r @"C:\Users\xyz\Desktop\fparsec-main-default\Build\VS10\bin\Debug\FParsec.dll";
#endif

Замена ; на ;; приведет к исчезновению всех ошибок:

#if INTERACTIVE
    #r @"C:\Users\xyz\Desktop\fparsec-main-default\Build\VS10\bin\Debug\FParsecCS.dll";;
    #r @"C:\Users\xyz\Desktop\fparsec-main-default\Build\VS10\bin\Debug\FParsec.dll";;
#endif
0 голосов
/ 24 августа 2011

Красные подчеркивания ясно показывают, что компилятор считает, что pipe2 принимает четыре аргумента - вы должны быть в состоянии подтвердить это, добавив круглые скобки вокруг всего тестового выражения, например: (test ns "namespace abs { def ghi })

Я не уверен, почему, хотя; попробуйте поставить скобки вокруг вызова pipe2:

let ns = 
  (pipe2  
     (spaces >>. skipString "namespace" >>. spaces >>. many1Satisfy isLetter) 
     (spaces >>. skipString "{" >>. classes .>> skipString "}") 
     (fun name classes -> { Name = name; Classes = classes } ))
...