私はOcamlに興味があり、Seperate_by
という関数を書く方法について興味があり、リストと要素のリスト元のリストを分割します。例えばリストをリストをパラメータリストとしてリストに分割してOcamlを分割する
、
Seperate_by [1;2;3;4;5;6;7] [3;5]
は、事前に[[1;2];[4];[6;7]]
感謝の出力を持っているはず!
私はOcamlに興味があり、Seperate_by
という関数を書く方法について興味があり、リストと要素のリスト元のリストを分割します。例えばリストをリストをパラメータリストとしてリストに分割してOcamlを分割する
、
Seperate_by [1;2;3;4;5;6;7] [3;5]
は、事前に[[1;2];[4];[6;7]]
感謝の出力を持っているはず!
あなたはこれを試すことができます。
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]]
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の '型'を意味するので、関数の名前は小文字で始まらなければなりません。
驚くばかり!再帰の代わりにList.fold_leftを使ってそれを行う方法があるかどうか知っていますか? –
@V。 Michelが 'else(res、x :: acc)' uで行ったように、 '@'を使ってList.fold_leftを使うか、 '::'を使ってList.fold_rightを使うことができますList.fold_leftをcorseの 'else(res、acc @ [x])'で変更することで、fold_leftのパラメータの順序を変更する必要があります。 –
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)
私は新しいケースを追加しました.Zhenyuの答えはもっとはっきりしていますが、私はどのように折り畳み形式に変換するのか知りたい –
!しかし、ちょうどfyiのインラインコードの書式設定を行うのはティルドキー(squigglyキー)です。 –
OCamlで関数名を大文字にすることはできません:) –
何を試してみましたか、それに問題があるようですか? –