У меня есть следующий код в Haskell:Есть ли способ удалить дубликаты операторов в Haskell?
move :: Camera -> (Double, Double, Double) -> Camera
move camera (xt, yt, zt) = camera { cPosition = (x + xt, y + yt, z + zt) }
where (x, y, z) = cPosition camera
moveForward :: Camera -> Camera
moveForward camera = move camera (-1 * sin ya, 0, -1 * cos ya)
where (_, ya, _) = cRotation camera
moveBackward :: Camera -> Camera
moveBackward camera = move camera (sin ya, 0, cos ya)
where (_, ya, _) = cRotation camera
Вы заметите, что moveForward
и moveBackward
функции имеют одинаковые where
заявления. Есть ли способ удалить это дублирование? У меня есть множество функций с теми же предложениями where
(читай: более двух).
Я бы предпочел не передавать его в качестве другого аргумента - так как он никогда не изменится. Он всегда будет cRotation
.
Рассматривали ли вы переход от неловкого '(Double, Double, Double)' к чему-то выделенному, например ['Data.Vect'] (http://hackage.haskell.org/package/vect-0.4.7/ Docs/Data-Vect-Double-base.html # т: vec3)? – leftaroundabout
@leftaroundabout У меня есть - я жду от двух вещей, однако. Во-первых, потому что эта тема для меня нова, все меняется ежедневно. Во-вторых, я не уверен, где мне придется оптимизировать определенные вещи. После того, как все станет более конкретным, я взгляну на «Data.Vect», спасибо! – sdasdadas