У меня есть некоторые функции перемещения/доступа для работы с моим типом сетки:
cell :: Mesh a -> Int -> Maybe (Cell a)
neighbour :: Mesh a -> Int -> Cell a -> Maybe (Cell a)
owner :: Mesh a -> Cell a -> Maybe (Cell a)
Чтобы не передавать сетку каждой функции и обрабатывать сбои, я создал их монадическую версию с помощью этой составной монады:
type MMesh a b = MaybeT (State (Mesh a)) b
Итак, у меня есть такие монадические аксессоры:
getMesh = get :: MMesh a (Mesh a) -- just to remove type declarations
cellM id = getMesh >>= (MaybeT . return) <$> (\m -> cell m id)
neighbourM idx cell = getMesh >>= (MaybeT . return) <$> (\m -> neighbour m idx cell)
ownerM cell = getMesh >>= (MaybeT . return) <$> (\m -> owner m cell)
Очевидно, они следуют одному и тому же шаблону, и я был бы рад перенести общую часть в какую-нибудь внешнюю функцию, скажем, liftMesh
, чтобы переписать приведенный выше код следующим образом:
cellM = liftMesh cell
neighbourM = liftMesh neighbour
ownerM - liftMesh owner
Но для этого сначала необходимо переписать функции в бесточечном стиле, чтобы опустить переменное количество аргументов. И вот где я застрял, так может ли кто-нибудь помочь преобразовать это в бесточечное или найти другие способы добиться того же результата?
Upd: добавление полного текста сюда: http://pastebin.com/nmJVNx93
Mesh
,Cell
и т. д. Людям будет проще убедиться, что их бесточечные версии проверяются на тип. - person jub0bs   schedule 06.09.2015