2013-09-14 3 views
4

Я пишу библиотеку AST для простого «динамически типизированного» языка. Я написал свое синтаксическое дерево и парсер. Теперь я работаю над управлением АСТ, и я заинтересован в использовании пакета объективов для этой цели.Список Haskell и Control.Lens

Рассмотрим

data Obj = Obj !(Map Text Obj) 
     | Arr ![Obj] 

Я могу написать объектив для манипулирования полями объекта довольно легко:

field t (Obj m) = m^.at t 
field _ _  = Nothing 

, но я понятия не имею, где начать для манипулирования элементами приб. Я хотел бы линзу вдоль линий:

arrIx :: Int -> Obj -> Maybe Obj 
arrIx i (Arr objs) = objs^.someLensHere i 
    where someLensHere i = undefined 

Я изменю мое представление Obj для целесообразности, но он все равно будет полезно знать, как индекс в списках с помощью линзы.

ответ

7

Для указания списков с помощью объектива используйте ix. Пример:

>>> let myList = [1,4,2,212,5] 
>>> myList ^? ix 2 -- (^?) gets the result as a Maybe 
Just 2 
>>> preview (ix 10) myList -- preview is the non-operator version of (^?) 
Nothing 
>>> myList & ix 3 .~ 4 -- Set the 4zh element to 4. 
[1,4,2,4,5] 
>>> myList & ix 10 .~ 5 -- Inserting new elements is not possible 
[1,4,2,212,5]  

Существует также еще один вопрос о Difference between at and ix.

+0

Супер! Спасибо. – nomen

Смежные вопросы