Я пытаюсь реализовать Рунге-Кутта 4-го порядка в Haskell, но мне сложно использовать систему типов Haskell для этой задачи. Может кто поможет? Я хочу изменить типы State и DState на классы типов в следующем коде:
data State = State Double deriving (Show)
data DState = DState Double deriving (Show)
update :: State -> DState -> State
update (State x) (DState y) = State (x+y)
add :: DState -> DState -> DState
add (DState x) (DState y) = DState (x + y)
scale :: Double -> DState -> DState
scale h (DState x) = DState (h*x)
update_rk4 :: State -> (Double -> State -> DState) -> Double -> Double -> State
update_rk4 y f t h = update y (scale (h*(1.0/6.0)) s) where
s = add k1 (add s2 (add s3 k4))
s2 = scale 2 k2
s3 = scale 2 k3
k1 = f t y
k2 = f (t+0.5*h) ( update y (scale (0.5*h) k1) )
k3 = f (t+0.5*h) ( update y (scale (0.5*h) k2) )
k4 = f (t+h) ( update y (scale h k3) )
Сложно сформулировать классы типов, поскольку State и DState взаимосвязаны в том смысле, что конкретный экземпляр State требует определенного экземпляра DState .. Или, возможно, существует какой-то другой подход, который я не вижу?