2017-02-09 19 views
1

私はOcamlに興味があり、Seperate_byという関数を書く方法について興味があり、リストと要素のリスト元のリストを分割します。例えばリストをリストをパラメータリストとしてリストに分割してOcamlを分割する

Seperate_by [1;2;3;4;5;6;7] [3;5] 

は、事前に[[1;2];[4];[6;7]]

感謝の出力を持っているはず!

+0

!しかし、ちょうどfyiのインラインコードの書式設定を行うのはティルドキー(squigglyキー)です。 –

+0

OCamlで関数名を大文字にすることはできません:) –

+2

何を試してみましたか、それに問題があるようですか? –

答えて

0

あなたはこれを試すことができます。

let seperate_by l lsep = 
    let add acc res = if acc<>[] then acc::res else res in 
    let(res,acc)= 
    List.fold_right (fun x (res,acc) -> 
     if List.exists ((=)x) lsep then (add acc res,[]) else (res,x::acc) 
    ) l ([],[]) 
    in 
    add acc res 

テスト:あなたが接近していた

# seperate_by [1;2;3;4;5;6;7] [3;5];; 
- : int list list = [[1; 2]; [4]; [6; 7]] 
# seperate_by [1;2;3;4;5;6;7] [3;5;7];; 
- : int list list = [[1; 2]; [4]; [6]] 
# seperate_by [1;2;3;4;5;6;7] [1;5;7];; 
- : int list list = [[2; 3; 4]; [6]] 
0
let rec seperate_by l sign= 

    let rec aux2 = function 
    (head,[])->(head,[]) 
    |(head,x::r) -> if List.exists ((=) x) sign then (head,r) 
    else aux2 ([email protected][x],r) 
    in 

    let res = aux2 ([],l) in 
    match res with 
    |(head,[])->head::[] 
    |(sub_list,rest_list) -> (sub_list)::(split rest_list sign) 
     ;; 

(*機能AUX2は、リストの最初のsub_listを返しますので、私は、リストの残りの部分とリストを構築維持し、最終的に我々は*の結果を持っている)

注:私はあなたのことを見ました関数名は大文字btで始まります。すべての変数は大文字で始まり、Ocamlの '型'を意味するので、関数の名前は小文字で始まらなければなりません。

+0

驚くばかり!再帰の代わりにList.fold_leftを使ってそれを行う方法があるかどうか知っていますか? –

+0

@V。 Michelが 'else(res、x :: acc)' uで行ったように、 '@'を使ってList.fold_leftを使うか、 '::'を使ってList.fold_rightを使うことができますList.fold_leftをcorseの 'else(res、acc @ [x])'で変更することで、fold_leftのパラメータの順序を変更する必要があります。 –

0
let rec seperate_by l sign= 
    let rec aux2 = function 
     (head,[])->(head,[]) 
     |(head,x::y::r) when x=y -> if List.exists ((=) x) sign then ([email protected][],y::r) else aux2 ([email protected][x],y::r) 
     |(head,x::r) -> if List.exists ((=) x) sign then (head,r) else aux2 ([email protected][x],r) 
    in 
    let res = aux2 ([],l) 
    in 
    match res with 
     |(head,[])->head::[] 
     |(sub_list,rest_list) -> (sub_list)::(seperate_by rest_list sign)  
+0

私は新しいケースを追加しました.Zhenyuの答えはもっとはっきりしていますが、私はどのように折り畳み形式に変換するのか知りたい –

関連する問題