Как я могу исправить эту ошибку FS00003? - PullRequest
1 голос
/ 02 октября 2011

Это мой код:

module RTX

open System
open System.Text.RegularExpressions

let input = "Line 1: Num allocs:3 New:2 Delete:1
Line 2: Num allocs:3 New:2 Delete:1
Line 3: Num allocs:3 New:2 Delete:1"

type AllocResult = { lineNo:string; numAllocs:string; news:string; frees:string }

let matches = Regex.Matches(input,@"Line (\d+): Num allocs:(\d+) New:(\d+) Delete:(\d+)",RegexOptions.Singleline)
let matchCollection = [ for m in matches do if m.Success then yield [for l in m.Groups -> l.Value]]
let allocCreator (e: string list) = { lineNo = e.[0]; numAllocs = e.[1]; news = e.[2]; frees = e.[3] }
let wfirst = List.map allocCreator List.map List.tail matchCollection

List.iter (fun e -> printfn "%s\n") wfirst
//List.iter (printfn "%s\n") matchCollection
Console.ReadLine()

Я получаю ошибку: This value is not a function and cannot be applied (FS0003), и она появляется в части List.map allocCreator.По сути, я хочу удалить строку, которая соответствует совпадению, и сохранить только записи в записи.

РЕДАКТИРОВАТЬ: я постараюсь объяснить немного больше, чего я хотел достичь. Результат матча будетчто-то вроде этого:

[ "Line 1: Num allocs:3 New:2 Delete:1"; "1"; "3"; "2"; "1"; ]

Используя let matchCollection = [ for m in matches do if m.Success then yield [for l in m.Groups -> l.Value]] Я пытался получить список списков, что-то вроде этого:

[["Line 1: Num allocs:3 New:2 Delete:1"; "1"; "3"; "2"; "1"; ];["Line 2: Num allocs:3 New:2 Delete:1";"2"; "3"; "2"; "1"; ]; ["Line 3: Num allocs:3 New:2 Delete:1";"3"; "3"; "2"; "1"]]

Используя List.map List.tail matchCollection, я пыталсячтобы получить из приведенного выше списка, к этому:

[["1"; "3"; "2"; "1"; ];["2"; "3"; "2"; "1"; ]; [;"3"; "3"; "2"; "1"]]

И с помощью List.map allocCreator я пытался превратить приведенный выше список в список записей.Я немного новичок в F # и, возможно, моя логика неверна, но я не понимаю, почему / где.

РЕДАКТИРОВАТЬ 2: Кажется, проблема приоритета.Если я сделаю это:

let wfirst = List.map allocCreator (List.map List.tail matchCollection);;

Тогда я получу то, что мне нужно.

Ответы [ 2 ]

1 голос
/ 02 октября 2011
let wfirst = List.map allocCreator <| List.map List.tail matchCollection
List.iter (printfn "%A\n") wfirst
1 голос
/ 02 октября 2011

Не уверен, что вы пытаетесь достичь с помощью этой строки, но давайте посмотрим на типы, чтобы попытаться выяснить это

первый

List.map allocCreater

это уже неверно, первыйАргумент для карты должен иметь тип 'a -> 'b, но вы дали список

List.map List.tail matchCollection

Это string list list

Я понятия не имею, что вы на самом деле пытаетесь получить здесь, но у вас, похоже, короткая функция или слишком много списков

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