我在学校有一些Ocaml课程,为了练习,我们必须编写函数长度。
我的老师向我们展示了Xavier Leroy如何编写他的功能:
@Service
public class MyService {
...
private CloseableHttpClient closeableHttpClient;
public String setPayment() {
...
try {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader(ACCEPT, APP_JSON);
httpPost.setHeader(CONTENT_TYPE, APP_JSON);
StringEntity entity = new StringEntity(request, CHARSET);
httpPost.setEntity(entity);
CloseableHttpResponse response = closeableHttpClient.execute(httpPost);
logger.info("Execution");
} catch (IOException e) {
logger.error("Error");
}
}
}
当我的老师向我们解释为什么他会做这样的长度函数时,他说他不知道为什么Xavier Leroy不写:
let rec length_aux len = function
[] -> len
| a::l -> length_aux (len + 1) l
let length l = length_aux 0 l
...为了使它更快(因为大多数情况下列表都是非空的)。
所以,如果有人知道为什么第二个并不比第一个更好,你能回答我吗?
谢谢。
答案 0 :(得分:5)
对于OCaml,这是相同的功能。模式匹配将被编译为测试列表是否为空,并跳转到一侧或另一侧。
C中的类似代码将在switch
语句中重新排序案例。