我想更新Elm类型的记录
type CubeData = {currDirection : Vec3, translation : Vec3, transform : Mat4}
Run Code Online (Sandbox Code Playgroud)
我可以使用以下代码来做.
updateCubeData : CubeData -> CubeData
updateCubeData cubeData = {cubeData | translation <- cubeData.currDirection,
transform <- translate cubeData.translation cubeData.transform}
Run Code Online (Sandbox Code Playgroud)
但是,我现在想要根据字段的当前值不同地更新记录的字段,所以我尝试这样做
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}
Run Code Online (Sandbox Code Playgroud)
这是一个类型错误,我在下面转载.请注意,类型签名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}
Run Code Online (Sandbox Code Playgroud)
如果我删除了该if语句,只需将该函数设置为等于该内容,then并且else代码编译并按预期运行(如果该块是整个方法).为什么在这里添加if语句会引入此类型错误,如何解决?
类型错误来自您的代码的这一部分:
abs cubeData.translation.x > 2.0 || abs cubeData.translation.y > 2.0
编译器抱怨它cubeData.translation是类型,Vec3但你正在将它视为类型{a | y : Float, x : Float}.也就是说,Vec3它不是包含字段x和y的记录类型.
我相信你真的想使用getX和getY功能的Math.vector3:
abs (cubeData.translation |> getX) > 2.0 || abs (cubeData.translation |> getY) > 2.0