Я хочу обновить запись в 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
и просто установлю функцию, равную содержимому then
и else
, код скомпилируется и запустится, как и ожидалось (если этот блок был целым методом). Почему добавление оператора if, как здесь, приводит к ошибке этого типа и как ее исправить?