在this response到another question,給出了一個小Haskell代碼草圖,它使用包裝函數來分解一些代碼,用於在命令行參數上進行語法檢查。下面是我正在試圖簡化代碼的一部分:如何避免爲執行模式匹配的函數編寫樣板代碼?
takesSingleArg :: (String -> IO()) -> [String] -> IO()
takesSingleArg act [arg] = act arg
takesSingleArg _ _ = showUsageMessage
takesTwoArgs :: (String -> String -> IO()) -> [String] -> IO()
takesTwoArgs act [arg1, arg2] = act arg1 arg2
takesTwoArgs _ _ = showUsageMessage
有沒有一種方法(可能使用Template Haskell?),以避免編寫額外的函數的參數各是多少?理想情況下,我想能夠寫類似(我在做這個語法上)
generateArgumentWrapper<2, showUsageMessage>
這擴展到
\fn args -> case args of
[a, b] -> fn a b
_ -> showUsageMessage
理想情況下,我甚至可以有不同數量的參數傳遞給generateArgumentWrapper
元的功能,這樣我就可以做
generateArgumentWrapper<2, asInt, asFilePath, showUsageMessage>
這擴展到
\fn args -> case args of
[a, b] -> fn (asInt a) (asFilePath b)
_ -> showUsageMessage
有沒有人知道一種方法來實現這一目標?將命令行參數([String]
)綁定到任意函數將是一種非常簡單的方法。或者可能有一個完全不同的,更好的方法?
另請參見標準庫中的Text.Printf,它或多或少地執行相同的操作。請注意,提供錯誤數量的參數是運行時錯誤,而不是類型錯誤。 – 2012-04-12 13:14:51