2016-11-03 38 views
0

第一,这是我的代码:我做区分OCaml中的功能和我有一些问题

module Problem1 = struct 
    type aexp = 
    | Const of int 
    | Var of string 
    | Power of string * int 
    | Times of aexp list 
    | Sum of aexp list 

    let diff : aexp * string -> aexp 
    = fun (exp, var) -> 
     match exp with 
     |Const a -> Const 0 
     |Var x -> if x = var then Const 1 else Var x 
     |Power (s, i) -> 
      if s = var then Times[Const i;Power (s, i - 1)] else Power (s, i) 
     |Times l -> 
      match l with 
       |h::t -> Sum[Times[diff (h, var);t];diff (t, var)] 
     |Sum m -> 
      match m with 
       |h::t -> Sum[diff(h, var); diff(t, var)];; 
end 

的解释器说,

Error: This variant pattern is expected to have type aexp list 
     The constructor Sum does not belong to type list 

但我想要的符号M是一个aexp列表。 找不到错在哪里。

+2

顺便说一句,这是你问在计算器的第五个问题,他们都没有一个公认的答案,因为人们为你做一些努力,这是一种不礼貌的,你可以通过接受你找到合适的答案,至少感谢他们。 – Lhooq

+0

哦,我在stackoverflow中很新手,我不知道如何接受答案。对不起...谢谢你的好意.. :)) –

回答

2

其实你的问题很简单,你会使用工具,知道如何缩进OCaml的代码;-)

看看你的最后一个行是如何与一个OCaml的压头缩进都看到了:

|Times l -> 
     match l with 
     |h::t -> Sum[Times[diff (h, var);t];diff (t, var)] 
     |Sum m -> 
      match m with 
      |h::t -> Sum[diff(h, var); diff(t, var)];; 

是的,没错,因为您在Times l中创建了匹配的新模式,因此Sum m包含在其中。你应该写

|Times l -> begin 
     match l with 
     |h::t -> Sum[Times[diff (h, var);t];diff (t, var)] 
     end 
    |Sum m -> 
     match m with 
     |h::t -> Sum[diff(h, var); diff(t, var)];; 

它会工作得很好。

顺便说一下,您将会遇到另一个问题,因为您没有写let rec diff ...,而是let diff,并且您正在递归调用diff

1

对我而言,这部分看起来:Times[diff (h, var);t]。由于taexp list,因此您应该使用其他列表构造函数::来使它成为Times(diff(h,var):: t)。

1

如果你把match .. with ..的另一match .. with的情况下里面,你需要包装的内部用一个.. beginend

(* I do not check the code is correct *) 
let diff : aexp * string -> aexp 
    = fun (exp, var) -> 
    match exp with 
    |Const a -> Const 0 
    |Var x -> if x = var then Const 1 else Var x 
    |Power (s, i) -> 
     if s = var then Times[Const i;Power (s, i - 1)] else Power (s, i) 
    |Times l -> 
     begin match l with 
     |h::t -> Sum[Times[diff (h, var);t];diff (t, var)] 
     end 
    |Sum m -> 
     match m with 
     |h::t -> Sum[diff(h, var); diff(t, var)] 

请安装正确的自动缩进工具,如图阿雷格或OCP缩进,因为他们可以告诉适当的程序结构。手压痕经常愚弄你的眼睛。