1

私のコードを見てください:

let my lst p q =
  if lst = [] then
    []
  else
    let i = 0 in let res = [] in let acc=[] in
    fold_left ( fun acc h -> 
      if (not (p h) && not(q h)) then
    ((i+1), [], res)
      else if (p h && not (q h)) then
    ((i+1), (i::acc),res)
      else if (not (p h) &&  q h) then
    ((i+1), [] (acc@res))
      else
    ((i+1), [], ((i::acc)@res))) 
     (i,acc,res) lst;;

そして、コンパイルのエラーが発生しました:

この式は型 int * int list * 'a list を持っていますが、型 int list の式が予期されていました

手伝って頂けますか ?

4

1 に答える 1

1

この問題は、fold 関数の使用方法に起因します。

fold_left ( fun acc h -> 
  ...
)  

トリプルであるアキュムレータに関しては、次のようにすることをお勧めします。

 ....
fold_left ( fun (i', acc', res') h -> 
  here replace i, acc res by i' acc' res'
)  

さらに、i、acc、および res の定義を削除します。
このように値を直接入れて、

 ....
fold_left ( fun (i', acc', res') h -> 
  here replace i, acc res by i' acc' res'
)  (0, [], []) lst;;

最後に、 による無名関数呼び出しはfold_left、fold の呼び出しの上にバインドする必要があります。

.....
let helper (i, acc, res) x = 
    .....
in fold_left helper (0, [], []) lst;;
于 2013-10-27T13:48:28.513 に答える