Поскольку подпись уже ограничивает тип, вы можете удалить часть :: a
в теле функции:
getMaxBound :: Bounded a => a -> a
getMaxBound _ = maxBound
Подпись типа указывает этот тип вход функции совпадает с типом выхода функции.
Например:
Prelude> getMaxBound (3 :: Int)
9223372036854775807
Prelude> getMaxBound 'c'
'\1114111'
Prelude> getMaxBound True
True
Prelude> getMaxBound LT
GT
ScopedTypeVariables
Мы также можем использовать ScopedTypeVariables
расширение [Haskell-wiki] , а затем реализовать его со ссылкой на переменную типа a
:
{-# LANGUAGE ScopedTypeVariables #-}
getMaxBound :: forall a . Bounded a => a -> a
getMaxBound _ = maxBound :: a
Поскольку Mehrdad Afshari прокомментировал сообщение Песто, включая перевод назад в исходную координату, которой будет система:
x_rotated = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle)) + x_origin
y_rotated = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle)) + y_origin
Принятие Вы используете стандартную векторную реализацию, где (0,0) был бы верхний левый угол и Вы вращаетесь вокруг точки (x_origin, y_origin), это должно сделать это:
x = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle))
y = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle))
Примечание, что y's y_origin - y
, потому что y повышения стоимости, как Вы спускаетесь.
Необходимо будет использовать , матрица перевода для перемещения вращается о другой точке.
Решение состоит в том, чтобы перевести вектор в систему координат, в которой центр вращения (0,0). Примените матрицу вращения и переведите вектор назад в систему исходной координаты.
dx = x of rotation center
dy = y of rotation center
V2 = V - [dx, dy, 0]
V3 = V2 * rotation matrix
Result = V3 + [dx, dy, 0]