2

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 listfeatures分析を行う前にデータを正規化するために、各ポイントのリストの 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のインデントを多少台無しにしました、ごめんなさい!)

4

2 に答える 2