2016-11-03 37 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縮進,因爲他們可以告訴適當的程序結構。手壓痕經常愚弄你的眼睛。