Java コードのネストされた for ループを SML に変換しようとしています。[[a, b, c], [d, e, f], [g, h, i]] という形式のリストを作成します。この関数で [ [a、d、g]、[b、e、h]、[c、f、i]]。各リストの長さはさまざまなので、変更可能なデータ型は使用しないようにする必要があります。これまでのコードは次のとおりです。下部pointFromList
では、各内部リストを取得して、別の場所で定義したレコードにドロップします。
私が抱えている問題は、以下のコードが終了しないことです。デバッグ出力を見ると、すべてのzipElement ([], xs::xss, accY, accX)
呼び出しで問題なく動作しますが、その後どこかで壊れます。私は SML が初めてで、完全に困惑しています。
fun zipListToPoints (featuress : real list list) =
let
fun zipElement ([], [], accY, []) =
accY
| zipElement ([], [], accY, accX) =
zipElement(rev(accX), rev(accY), [], [])
| zipElement ([], xs::xss, accY, accX) =
zipElement([], xss, [hd(xs)]::accY, tl(xs)::accX)
| zipElement (ys::yss, xs::xss, accY, accX) =
zipElement (yss, xss, (hd(xs)::ys)::accY, tl(xs)::accX)
val numFeatures = length(hd(featuress))
val zippedList = zipElement([], featuress, [], [])
in
map pointFromList zippedList
end
end
より大きなコンテキストはpoint
、 label を持つレコード タイプがあるということですfeatures : real list
。features
分析を行う前にデータを正規化するために、各ポイントのリストの i 番目の要素に対して操作を実行する必要があります。元の Java は次のようになります。
for(i=0;i<Points.length(); i++){
oneFeature = new float[Points.getNumberOfFeatures()];
for(j=0; j<Points.getNumberOfFeatures(); j++){
oneFeature[j] = Points[j].getFeature(i);
}
normalizedData = new float[Points.getNumberOfFeatures()];
normalizedData = normalize(oneFeature);
for(k=0; k<Points.length(); k++){
Points[k].setFeatureList(normalizedData[k]);
}
}
私のSMLは最終的に次のようになります。
fun normalizeData (points) =
let
fun extractFeature (index) =
map (fn features => sub(features, index)) #features(points)
val listOfFeatures =
map extractFeature list.Tabulate (length(points), fn x => x)
val normalizedFeatures =
map normalizeFeature listOfFeatures
in
map zipListToPoints normalizedFeatures
end
(SOは私のSMLのインデントを多少台無しにしました、ごめんなさい!)