我有这样一个情况,递归函数基于命令行参数做出决策。递归函数不是由
但是,在
在面向对象的语言中,你只需要在类中拥有一个成员变量,或某种全局变量。
main
直接调用的。我想知道最好的方法是将这些参数传递给函数。我不想在递归函数内部调用getArgs
,因为那会增加很多开销。但是,在
main
中调用getArgs
然后通过一个不使用这些参数的函数传递参数是很麻烦的。虽然这个例子不是递归的,但是希望你可以理解概念。import Data.Char
import System.Environment
main :: IO ()
main = do
args <- getArgs -- want to use these args in fun2
traverse_ fun1 ["one", "two", "three"]
fun1 :: String -> IO ()
fun1 s = traverse_ fun2 s
fun2 :: Char -> IO ()
fun2 c = do
if "-u" `elem` args then print $ toUpper c -- how to get args here?
else print $ toLower c
把参数传递来传递去似乎不是个好主意:
import Data.Char
import System.Environment
main :: IO ()
main = do
args <- getArgs -- want to use these args in fun2
traverse_ (fun1 args) ["one", "two", "three"]
fun1 :: [String] -> String -> IO ()
fun1 args s = traverse_ (fun2 args) s
fun2 :: [String] -> Char -> IO ()
fun2 args c = do
if "-u" `elem` args then print $ toUpper c
else print $ toLower c
在面向对象的语言中,你只需要在类中拥有一个成员变量,或某种全局变量。
ReaderT
,如果成员需要可变,则为StateT
。下面的其中一个答案会更详细地涵盖这一点。 - Asa