python - 将简单的命令式算法转换为函数式风格

标签 python haskell functional-programming imperative-programming

我最近做了一个小算法,从一段代码中去除函数参数,只保留最外层的函数。
我发现这个算法非常容易以命令式的方式设计。
但是,我对函数式编程非常感兴趣,我想知道如何以函数式方式完成同样的事情。

如果你能告诉我这样的算法是如何工作的,那将对我很有帮助,这样我可能会更好地了解函数式编程的工作原理。另外我想知道您在设计算法时的思考过程。

我用 Python 做了命令式版本,但你的答案不一定要用 Python; haskell 或任何其他语言都可以。

这是它的作用(将一个字符串作为输入并返回一个字符串):

"foo(a.d, b.e.fi()).go(sd, ds())"     -- returns -->  "foo().go()"
"foo(a, b).bar().fuu"                 -- returns -->  "foo().bar().fuu"
"foo.bar"                             -- returns -->  "foo.bar"

这是我的命令式代码:

def get_rid_of_arguments(text):
    i, start, end = 0, 0, 0
    result = ""
    for j, c in enumerate(text):
        if c == '(':
            if i == 0:
                start = j
                result += text[end:start]
            i += 1
        elif c == ')':
            i -= 1
            if i == 0:
                end = j + 1
                result += '()'
    return result + text[end:]

最佳答案

这是我的版本:

import Control.Monad
import Control.Monad.State

-- filter `str` with the "stateful" monadic predicate function `handleChar`, 
-- with an initial state of 0
getRidOfArguments :: String -> String
getRidOfArguments str = filterM handleChar str `evalState` 0

handleChar :: Char -> State Int Bool
handleChar '(' = modify (+1) >> gets (<= 1)
handleChar ')' = modify (max 0 . subtract 1) >> gets (== 0)
handleChar _   = gets (== 0)

我的思考过程是:我们正在过滤一个列表,所以 filter 浮现在脑海中;然而,我们是保留还是删除一个字符取决于某种状态(我们的开/闭括号数)。所以单子(monad)过滤器函数 filterM 是合适的,我们可以使用 State 单子(monad)来抽象我们的打开/关闭计数的管道。

如果您想了解有关上述工作原理的更多详细信息,请告诉我。

关于python - 将简单的命令式算法转换为函数式风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19181767/

相关文章:

Clojure 头部保留

python - 将数组的一小部分旋转 90 度

haskell - 如何实现 'ex::Maybe [[Maybe a]] -> [[a]] '方法

元组内的 Haskell 箭头

haskell - 双向加法约束

haskell - Constant Applicative Form 在什么意义上是适用的?

haskell - 函数字面量与 Lambda 表达式和匿名函数是一回事吗?

python:Pandas groupby 和应用优化

python - django logout() 不显示模板

python - 无法发送请求 : Only unicode objects are escapable. 没有任何类型 <class 'NoneType' >