Haskell で、1 つのリストを取り、それを 2 つの均等なサイズのリストに分割する関数に取り組んでいます。ここに私が持っているものがあります:
split (x:y:xs) = split2 ([((length(x:y:xs) `div` 2)-2) : x ++ y] : [xs])
split2 (x:xs:[y:ys]) = split2 ((x-1) : [xs] ++ y : [ys])
split2 (0:xs:[y:ys]) = (xs:[y:ys])
この関数は、リストの最初の 2 つの要素を取り、それらをリスト #2 にまとめ、最初のリストを 2 番目の要素として追加します。次に、リストの長さを取得し、それを 2 で割って、最初のリストから 2 つの要素が既に削除されていることを考慮して、何回実行する必要があるかを調べます。次に、これら 2 つの情報を取得し、それを split2 に入れます。これは、最初のリストから別の要素を取得し、最初の要素の 2 番目のリストに追加します。また、実行回数から 1 をカウントダウンしてから、再度実行します。
問題は、実行すると次のようになることです。
Functions.hs:19:49:
Occurs check: cannot construct the infinite type: t0 = [t0]
In the first argument of `(:)', namely `(y)'
19 は、最初の split2 関数である 2 行目を示しています。このエラーを修正する方法が正確にはわかりません。何か案は?