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语句,并将函数设置为等于 的内容,then并且else代码按预期编译和运行(如果该块是整个方法)。为什么像我在这里添加一个 if 语句会引入这种类型的错误,我该如何解决它?

4

1 回答 1

6

类型错误来自您的这部分代码:

abs cubeData.translation.x > 2.0 || abs cubeData.translation.y > 2.0

编译器抱怨 that cubeData.translationis of typeVec3但您将其视为 type {a | y : Float, x : Float}。也就是说Vec3不是包含字段x和y的记录类型。

我相信您实际上想使用getX以下getY功能Math.vector3

abs (cubeData.translation |> getX) > 2.0 || abs (cubeData.translation |> getY) > 2.0

于 2014-06-21T02:34:03.597 回答