タイプの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 ステートメントを追加すると、この型エラーが発生するのはなぜですか? どうすれば修正できますか?then
else