У меня есть некоторые функции траверса/аксессоров работать с моим сетчатым типом:Pointfree преобразование
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
Но это первый нуждается в функции должна быть переписана в стиле pointfree опустить переменное число аргументов. И вот где я застрял, так может ли кто-нибудь помочь преобразовать это в pointfree или найти другие способы достижения одного и того же результата?
Upd: добавление полный текст здесь: http://pastebin.com/nmJVNx93
Пожалуйста, сделайте свой код самодостаточным. В частности, добавьте свои операторы импорта и определения для 'Mesh',' Cell' и т. Д. Пользователям будет проще убедиться, что их версии без ограничений. – Jubobs
Вы пробовали инструмент pointfree? –
Благодарим вас за идею, но кажется, что это слишком сложно для инструмента без очков или я что-то делаю неправильно –