Я пытаюсь создать игру, используя Haskell + Netwire 5 (+ SDL). Теперь я работаю над выходной частью, где я хотел бы создавать проводы, которые читаются в каком-либо игровом состоянии, и выводить поверхности SDL, которые должны быть задействованы на экране.Kleisli Arrow в Netwire 5?
Однако проблема заключается в том, что поверхности SDL содержатся в монаде IO
, поэтому любая функция, которая создает такие поверхности, должна иметь тип a -> IO b
. Конечно, arr
не создает Wire
от a -> m b
. Однако, поскольку сигнатура типа провода равна (Monad m, Monoid e) => Wire s e m a b
, она выглядит как Kleisi Arrow, но я не могу найти подходящего конструктора для создания такого провода.
Я новичок в FRP и Arrows и не запрограммировал много в Haskell, так что это может быть не лучший способ реализовать выход графики. Если я ошибаюсь с самого начала, пожалуйста, дайте мне знать.
Некоторые СВД функции, связанные:
createRGBSurfaceEndian :: [SurfaceFlag] -> Int -> Int -> Int -> IO Surface
fillRect :: Surface -> Maybe Rect -> Pixel -> IO Bool
blitSurface :: Surface -> Maybe Rect -> Surface -> Maybe Rect -> IO Bool
flip :: Surface -> IO()
Update проверяет тип 1
Этот код, но теперь я пытаюсь интерфейс с SDL для тестирования
wTestOutput :: (Monoid e) => Wire s e IO() SDL.Surface
wTestOutput = mkGen_ $ \a -> (makeSurf a >>= return . Right)
where
makeSurf :: a -> IO SDL.Surface
makeSurf _ = do
s <- SDL.createRGBSurfaceEndian [SDL.SWSurface] 800 600 32
SDL.fillRect s (Just testRect) (SDL.Pixel 0xFF000000)
return s
testRect = SDL.Rect 100 100 0 0
Видимо, вы уже ответили на свой вопрос. Положите это как ответ, вместо того, чтобы добавить его к вашему вопросу. (В частности, вероятно, достаточно упомянуть 'mkGen_' и это тип ответа, конкретная реализация, вероятно, менее интересна для будущих читателей). Если у вас больше вопросов, задайте их отдельно, вместо того чтобы менять свои вопросы. – Cubic
Нет, я еще не проверял, работает ли оно еще –
Теперь я как бы проверил использование 'putStrLn' в качестве более простого примера. –