簡體   English   中英

使用foldl的Haskell函數合成

[英]Haskell function composition using 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
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM