试图简化代码的斗争

时间:2014-07-05 12:29:22

标签: haskell

我有以下方法:

mainFunction arg1 = "http://someBaseUrl.com/" ++ arg1
url1 x = mainFunction x ++ "/subUrl1"
url2 x = mainFunction x ++ "/subUrl2"
url3 x = mainFunction x ++ "/subUrl3"
url4 x = mainFunction x ++ "/subUrl4"

我的直觉告诉我它必须简化。但我无法弄清楚如何。

但是,我不能这样做,因为它不一样:

url1 = (mainFunction .) ++ "/subUrl1"

您的建议?

3 个答案:

答案 0 :(得分:5)

你可以做到

url s x = mainFunction x ++ s
url1 = url "/subUrl1"
url2 = url "/subUrl2"
等等......

如果你真的要写尽可能少的代码并避免调用url树时间,你可以使用这个技巧(但是,我不确定是否推荐)

[url1, url2, url3, url4] = map url ["/subUrl1", "/subUrl2", "subUrl3", "subUrl4"]

这将声明四个函数url1,... url4

答案 1 :(得分:1)

你为什么不使用带有两个参数的单个函数?

url :: (Show a) => String -> a -> String
url x n = "www" ++ x ++ "/vvv" ++ show n

在处理URL和unicode时,您还应该使用Text

答案 2 :(得分:0)

您可以连接字符串以生成您的URL。要将非字符串值转换为字符串,如果它是Show的实例,则可以使用show

url a b = "http://someBaseUrl.com/" ++ a ++ "/subUrl" ++ (show b)

url函数接受一个“字符串”(字符列表)[Char]和另一个类型'a'(也是Show的一个实例)并返回一个新的“字符串”。

Prelude> let url a b = "http://someBaseUrl.com/" ++ a ++ "/subUrl" ++ (show b)
Prelude> url "foo" 3
"http://someBaseUrl.com/foo/subUrl3"
Prelude> :t url
url :: Show a => [Char] -> a -> [Char]