оператор if вызывает ошибку типа elm

Я хочу обновить запись в 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, как здесь, приводит к ошибке этого типа и как ее исправить?


elm
person Ben Pious    schedule 20.06.2014    source источник


Ответы (1)


Ошибка типа исходит из этой части вашего кода:

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

person Joe    schedule 21.06.2014