4

我对 OCaml 还是很陌生,希望在优化代码方面得到一些帮助。

我试图将给定列表的每个元素乘以列表的最后一个元素。

这是我的代码片段:

(* Find the last element of a function *)
let rec lastE = function
| [] -> []
| [x] -> x
| _ :: t -> lastE t;;

(*multiply a list by the last element*)
let rec lmul list =
match list with
[] -> []
| hd::tl -> (hd *. (lastE tl)) :: lmul tl;;

当我运行代码时,我收到此错误消息:

Error: This expression has type float list but 
an expression was expected of type 'a list list

我已经研究了一段时间,但是对于这个问题的任何帮助将不胜感激。

4

1 回答 1

2

换一种说法,戴夫纽曼告诉你的是,你的基本问题是lastE需要以不同的方式处理一个空列表。如果lastE应该返回一个数字,它必须在所有情况下都返回一个数字。就目前而言,lastE当它收到一个空列表时返回一个列表。

如果您不想使用List.map(再次像 Dave Newman 建议的那样),您至少可以考虑lastE只调用一次而不是为列表的每个元素调用一次。这将对长列表产生很大的影响。

于 2013-04-23T02:39:34.013 回答