Композиция функций Haskell с использованием foldl
Я определил следующую функцию в 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 ответ
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