我仍然是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
我一直在研究它,但是对此问题的任何帮助都将非常感激。
答案 0 :(得分:2)
要改写Dave Newman告诉你的不同,你的基本问题是lastE
需要以不同方式处理空列表。如果lastE
应该返回一个数字,则必须在所有情况下都返回一个数字。就目前而言,lastE
在收到空列表时会返回一个列表。
如果您不想使用List.map
(Dave Newman建议再次使用),您至少可以考虑只为列表中的每个元素调用一次lastE
而不是一次。这对于长名单会有很大的不同。