4

タイプのElmでレコードを更新したい

type CubeData = {currDirection : Vec3, translation : Vec3, transform : Mat4}

次のコードを使用して実行できます。

updateCubeData : CubeData -> CubeData
updateCubeData cubeData = {cubeData | translation <- cubeData.currDirection,
                                      transform <- translate cubeData.translation cubeData.transform}

ただし、フィールドの現在の値に応じてレコードのフィールドを異なる方法で更新したいので、これを試してみました

 updateCubeData : CubeData -> CubeData
 updateCubeData cubeData = if abs cubeData.translation.x > 2.0 || abs cubeData.translation.y > 2.0
                           then  {cubeData | translation <- cubeData.currDirection,
                                             transform <- translate cubeData.translation cubeData.transform}
                           else  {cubeData | currDirection <- negate cubeData.currDirection,
                                             translation <- cubeData.currDirection,
                                             transform <- translate cubeData.translation cubeData.transform}

これは型エラーであり、以下に再現しました。の型シグネチャがupdateCubeDataファイルの 12 行目にあることに注意してください。

Type error on line 15, column 68 to 76:
        cubeData

   Expected Type: {a | y : Float, x : Float}
     Actual Type: Vec3

Type error on line 18, column 68 to 76:
        cubeData

   Expected Type: {a | y : Float, x : Float}
     Actual Type: Vec3

Type error between lines 13 and 18:
        if | ((abs cubeData.translation.x) > 2.0) ||
             ((abs cubeData.translation.y) > 2.0) ->
               {cubeData |
                    translation <- cubeData.currDirection,
                    transform <- translate cubeData.translation cubeData.transform}
           | True ->
               {cubeData |
                    currDirection <- negate cubeData.currDirection,
                    translation <- cubeData.currDirection,
                    transform <- translate cubeData.translation cubeData.transform}

   Expected Type: Vec3
     Actual Type: {a | y : Float, x : Float}

ステートメントを削除し、関数をの内容とif等しく設定するだけで、コードは期待どおりにコンパイルおよび実行されます (そのブロックがメソッド全体である場合)。ここにあるように if ステートメントを追加すると、この型エラーが発生するのはなぜですか? どうすれば修正できますか?thenelse

4

1 に答える 1