Zin*_*ggi 4 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"
Run Code Online (Sandbox Code Playgroud)
这是我的命令性代码:
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:]
Run Code Online (Sandbox Code Playgroud)
这是我的版本:
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)
Run Code Online (Sandbox Code Playgroud)
我的思考过程是:我们正在过滤列表,所以filter想到了; 但是,我们是否保留或删除一个角色取决于某些状态(我们的开放/封闭的数量).所以monadic过滤器函数filterM是合适的,我们可以使用Statemonad来抽象我们的打开/关闭计数的管道.
如果您想了解有关上述工作方式的详细信息,请与我们联系.