3

私は F# が初めてで、リストを 2 つに分割するメソッド分割を作成しようとしています。最初の要素が分割する要素の数で、2 番目の要素が list であるタプルを取ります。たとえば、split (2, [1;2;3;4;5;6]) は ([1;2], [3;4;5;6]) を返す必要があります。

これは私がこれまでに持っているものですが、何らかの理由でタプルの2番目の要素を元のリストとしてヘッドなしで返しています。x::xs は自動的に x を先頭要素にし、xs をリストの残りの要素にするので、これは理解できません。これは、再帰呼び出しが前のリストの末尾を取得し、最初の項を切り捨てることを意味します。

let rec split = function
   |(n, []) -> ([], [])
   |(0, xs) -> ([], xs)
   |(n, x::xs) -> let temp = x :: fst (split(n-1, xs))
                  (temp, xs);;
4

1 に答える 1

4

問題は次の行にあります。

(temp,xs);;

ここであなたの例では、xs常に[2;3;4;5;6]n>0

次のようなものでリストの2番目の要素を取得する必要があります

|(n,x::xs) ->
    let a,b = split (n-1,xs)
    (x::a,b)
于 2015-09-11T05:42:36.463 に答える