E.g。如果您有一个功能(fun x -> x+1)
,并且想要将其映射到[1; 2; 3]
。但您只想在x=1
时映射它,以便输出为[2; 2; 3]
。你是怎么做到的?
使用OCaml,我试过了:
let rec foo (input : int list) : int list =
match input with
| [] -> []
| hd::tl -> List.map (fun x -> if x=1 then (x+1)) input;;
我已经尝试'何时'陈述,但无济于事。
答案 0 :(得分:9)
此处缺少else
分支。
你快到了。你只需要制作一个完整的if / else语句:
if x=1 then (x+1) else x
OCaml需要在上面表达式的任何分支上返回值。
要明确,when
后卫在这里无关紧要,因为它用于条件模式匹配。由于在这种情况下模式匹配是多余的,因此您的功能可以缩短很多:
let foo input =
List.map (fun x -> if x=1 then x+1 else x) input
答案 1 :(得分:2)
您实际上可以使用when
语句,即使我更喜欢@pad的解决方案:
let foo (input : int list) : int list =
let rec aux acc input =
match input with
[] -> List.rev acc
| x :: xs when x = 1 -> aux ((x + 1) :: acc) xs
| x :: xs -> aux (x :: acc) xs
in
aux [] input