Композиция функций Haskell с использованием foldl - PullRequest
0 голосов
/ 03 января 2019

Я определил следующую функцию в haskell:

step :: [Int] -> [Char] -> [Int]
step stack str
    | str == "*" =  remaining ++ [x*y] 
    | str == "+" =  remaining ++ [x+y]
    | str == "-" =  remaining ++ [x-y]
    | str == "/" =  remaining ++ [x `div` y]
    | otherwise = stack ++ [read str :: Int] 
    where x = (last . init) stack
          y = (last stack)
          remaining = (init . init) stack

Эта функция принимает целочисленный массив [10, 4, 3] и строковый оператор * и применяет оператор к последним двум элементам в массиве ивозвращает следующий массив [10, 7].

. Это составляет часть промежуточной функции, конечный результат - функция оценки обратной польской записи.

Как я могу использовать step функция, которую я определил, и foldl для выполнения следующих действий: :

Взять строку примеров: "10 4 3 + 2 * -".

Добавлять каждый элемент в строку до первого оператора.встречается так:

10, 4, 3 Затем примените оператор к двум элементам сверху стека и поместите результат в стек:

10, 7.

Продолжайте так до тех пор, пока не будет оценен окончательный ответ (-4)

Ответ:

Ради полноты этой функции я пришел с помощью@ talex

rpn :: String -> Int
rpn input = head result
    where arr = words input
          result = foldl step [] arr

1 Ответ

0 голосов
/ 03 января 2019
foldl step [] ["10",  "4", "3", "+", "2", "*", "-"]

[] здесь начальный стек.

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

step :: [Int] -> [Char] -> [Int]
step stack str
        | str == "*" =  (x*y):remaining 
        | str == "+" =  (x+y):remaining
        | str == "-" =  (x-y):remaining
        | str == "/" =  (x `div` y):remaining
        | otherwise = (read str :: Int):stack
        where x = head $ tail stack
              y = head stack
              remaining = tail $ tail stack
...