我有以下方法:
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"
您的建议?
答案 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]