F # в Visual Studio неверный тип кода - PullRequest
0 голосов
/ 05 марта 2020

Я пишу функцию для обработки оценки постфикса в F #. Это то, что у меня сейчас есть для функции оценки

//Postfix evaluation of string expr given variables bound to values as specified in vars
    let (numSt:int list) = []
    let rec innerEval (vars:(List<(string * int)>)) (stack: int list) (expr:string) =
    //Head and Tail for stack, head and tail for expr
        let chExpr = Seq.toList expr
        match expr with 
        |[] -> stack.Head
        |head::tail ->
            if head = '+' then
                let pushVal = stack.Head + stack.Tail.Head
                let newStack = pushVal::stack.Tail
                innerEval vars newStack tail
            elif head = '-' then 
                let pushVal = stack.Head - stack.Tail.Head
                let newStack = pushVal::stack.Tail
                innerEval vars newStack tail
            elif head = '/' then 
                let pushVal = stack.Head / stack.Tail.Head
                let newStack = pushVal::stack.Tail
                innerEval vars newStack tail
            elif head = '*' then 
                let pushVal = stack.Head * stack.Tail.Head
                let newStack = pushVal::stack.Tail
                innerEval vars newStack tail
            elif head = '$' then 
                let fstSt = stack.Head
                let sndSt = stack.Tail.Head
                let nhead = [fstSt; sndSt]
                let st =  nhead @ stack.Tail.Tail
                innerEval vars st tail
            elif head = '@' then 
                let nhead = tail.Head
                let newVars = newVarList nhead vars stack.Head //helper function newVarList
                innerEval newVars stack.Tail tail

             //else it's a letter that needs to give back a number

            else 
                let addNum = (getVal head vars) //get the number
                let newStack = addNum::stack //push that onto stack
                innerEval vars newStack expr //return to recursion on newStack

, которая, как я знаю, многословна, но когда я пытаюсь запустить этот код, я получаю сообщение об ошибке в коде, которое гласит:

pa4.fs(1194,38): error FS0001: This expression was expected to have type
    'string'    
but here has type
    'char'

Таким образом, мой вопрос не обязательно о самом коде (если кто-то не может понять, что с ним не так), а о сообщении об ошибке: очевидно, это означает, что у меня есть элемент с неправильным типом, но что означает (1194, 38) ? Я предполагаю строку 38, но большее число увеличивается каждый раз, когда я запускаю код, и я не уверен, что это значит?

Извините, если это вопрос нуба, эта задача была дана практически без указания направления !

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

F # T list - это неизменяемый односвязный список типа T, который не взаимозаменяем с string, который является его собственным примитивным типом. Тем не менее, string неявно равен seq<char>, поэтому вы можете использовать такие функции, как Seq.toList expr.

. Следовательно, вы не сможете сопоставить, используя шаблон списка.

let rec innerEval (vars:(List<(string * int)>)) (stack: int list) (expr:string) =
    match expr with //won't compile because expr isn't list
    | [] -> stack.Head
    | head::tail ->
         innerEval vars newStack tail //won't compile because tail is char list

Более простым решением было бы изменить сигнатуру innerEval (expr: string) на innerEval (expr: char list), чтобы преобразования были упрощены.

0 голосов
/ 05 марта 2020

Одна из ваших функций надеется получить «строку» (много символов мне нравится думать о том, что буквы партии хранятся в строке), но вместо этого она получает «c» «h» «a», ' r '(один символ). Я подозреваю, что newvarlist, потому что innereval выглядит хорошо? Трудно сказать, не глядя на функции, однако вы должны быть в состоянии навести на них курсор мыши. Код Visual Studio и Visual Studio с расширением ionide поддерживают это. Вы бы даже получили красные закорючки по строкам кода, которые не работают. Дайте мне знать, если это было полезно!

...