Haskell で 4 次の Runge-Kutta を実装しようとしていますが、このタスクに 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 の特定のインスタンスを必要とするという意味で絡み合っているため、型クラスを定式化するのは難しいようです。