{"id":"https://openalex.org/W2601103017","doi":"https://doi.org/10.22152/programming-journal.org/2017/1/7","title":"Profunctor Optics: Modular Data Accessors","display_name":"Profunctor Optics: Modular Data Accessors","publication_year":2017,"publication_date":"2017-03-31","ids":{"openalex":"https://openalex.org/W2601103017","doi":"https://doi.org/10.22152/programming-journal.org/2017/1/7","mag":"2601103017"},"language":"en","primary_location":{"id":"doi:10.22152/programming-journal.org/2017/1/7","is_oa":true,"landing_page_url":"https://doi.org/10.22152/programming-journal.org/2017/1/7","pdf_url":"https://arxiv.org/pdf/1703.10857v1","source":{"id":"https://openalex.org/S4210199781","display_name":"The Art Science and Engineering of Programming","issn_l":"2473-7321","issn":["2473-7321"],"is_oa":false,"is_in_doaj":false,"is_core":true,"host_organization":null,"host_organization_name":null,"host_organization_lineage":[],"host_organization_lineage_names":[],"type":"journal"},"license":null,"license_id":null,"version":"publishedVersion","is_accepted":true,"is_published":true,"raw_source_name":"The Art, Science, and Engineering of Programming","raw_type":"journal-article"},"type":"article","indexed_in":["arxiv","crossref"],"open_access":{"is_oa":true,"oa_status":"bronze","oa_url":"https://arxiv.org/pdf/1703.10857v1","any_repository_has_fulltext":true},"authorships":[{"author_position":"first","author":{"id":null,"display_name":"Matthew Pickering","orcid":null},"institutions":[{"id":"https://openalex.org/I36234482","display_name":"University of Bristol","ror":"https://ror.org/0524sp257","country_code":"GB","type":"education","lineage":["https://openalex.org/I36234482"]}],"countries":["GB"],"is_corresponding":false,"raw_author_name":"Matthew Pickering","raw_affiliation_strings":["University of Bristol, United Kingdom"],"raw_orcid":null,"affiliations":[{"raw_affiliation_string":"University of Bristol, United Kingdom","institution_ids":["https://openalex.org/I36234482"]}]},{"author_position":"middle","author":{"id":null,"display_name":"Jeremy Gibbons","orcid":null},"institutions":[{"id":"https://openalex.org/I40120149","display_name":"University of Oxford","ror":"https://ror.org/052gg0110","country_code":"GB","type":"education","lineage":["https://openalex.org/I40120149"]}],"countries":["GB"],"is_corresponding":false,"raw_author_name":"Jeremy Gibbons","raw_affiliation_strings":["University of Oxford, United Kingdom"],"raw_orcid":null,"affiliations":[{"raw_affiliation_string":"University of Oxford, United Kingdom","institution_ids":["https://openalex.org/I40120149"]}]},{"author_position":"last","author":{"id":null,"display_name":"Nicolas Wu","orcid":null},"institutions":[{"id":"https://openalex.org/I36234482","display_name":"University of Bristol","ror":"https://ror.org/0524sp257","country_code":"GB","type":"education","lineage":["https://openalex.org/I36234482"]}],"countries":["GB"],"is_corresponding":false,"raw_author_name":"Nicolas Wu","raw_affiliation_strings":["University of Bristol, United Kingdom"],"raw_orcid":null,"affiliations":[{"raw_affiliation_string":"University of Bristol, United Kingdom","institution_ids":["https://openalex.org/I36234482"]}]}],"institutions":[],"countries_distinct_count":1,"institutions_distinct_count":2,"corresponding_author_ids":[],"corresponding_institution_ids":[],"apc_list":null,"apc_paid":null,"fwci":2.0465,"has_fulltext":true,"cited_by_count":28,"citation_normalized_percentile":{"value":0.89493774,"is_in_top_1_percent":false,"is_in_top_10_percent":false},"cited_by_percentile_year":{"min":94,"max":99},"biblio":{"volume":"1","issue":"2","first_page":null,"last_page":null},"is_retracted":false,"is_paratext":false,"is_xpac":false,"primary_topic":{"id":"https://openalex.org/T10126","display_name":"Logic, programming, and type systems","score":0.8687000274658203,"subfield":{"id":"https://openalex.org/subfields/1702","display_name":"Artificial Intelligence"},"field":{"id":"https://openalex.org/fields/17","display_name":"Computer Science"},"domain":{"id":"https://openalex.org/domains/3","display_name":"Physical Sciences"}},"topics":[{"id":"https://openalex.org/T10126","display_name":"Logic, programming, and type systems","score":0.8687000274658203,"subfield":{"id":"https://openalex.org/subfields/1702","display_name":"Artificial Intelligence"},"field":{"id":"https://openalex.org/fields/17","display_name":"Computer Science"},"domain":{"id":"https://openalex.org/domains/3","display_name":"Physical Sciences"}},{"id":"https://openalex.org/T12377","display_name":"Digital Humanities and Scholarship","score":0.016499999910593033,"subfield":{"id":"https://openalex.org/subfields/1208","display_name":"Literature and Literary Theory"},"field":{"id":"https://openalex.org/fields/12","display_name":"Arts and Humanities"},"domain":{"id":"https://openalex.org/domains/2","display_name":"Social Sciences"}},{"id":"https://openalex.org/T10317","display_name":"Advanced Database Systems and Queries","score":0.016100000590085983,"subfield":{"id":"https://openalex.org/subfields/1705","display_name":"Computer Networks and Communications"},"field":{"id":"https://openalex.org/fields/17","display_name":"Computer Science"},"domain":{"id":"https://openalex.org/domains/3","display_name":"Physical Sciences"}}],"keywords":[{"id":"https://openalex.org/keywords/data-structure","display_name":"Data structure","score":0.6172000169754028},{"id":"https://openalex.org/keywords/data-type","display_name":"Data type","score":0.5896999835968018},{"id":"https://openalex.org/keywords/haskell","display_name":"Haskell","score":0.5837000012397766},{"id":"https://openalex.org/keywords/abstract-data-type","display_name":"Abstract data type","score":0.5202000141143799},{"id":"https://openalex.org/keywords/simple","display_name":"Simple (philosophy)","score":0.5160999894142151},{"id":"https://openalex.org/keywords/modular-design","display_name":"Modular design","score":0.44589999318122864},{"id":"https://openalex.org/keywords/data-manipulation-language","display_name":"Data manipulation language","score":0.3935999870300293},{"id":"https://openalex.org/keywords/sequence","display_name":"Sequence (biology)","score":0.38679999113082886},{"id":"https://openalex.org/keywords/data-model","display_name":"Data model (GIS)","score":0.38609999418258667}],"concepts":[{"id":"https://openalex.org/C41008148","wikidata":"https://www.wikidata.org/wiki/Q21198","display_name":"Computer science","level":0,"score":0.8543999791145325},{"id":"https://openalex.org/C199360897","wikidata":"https://www.wikidata.org/wiki/Q9143","display_name":"Programming language","level":1,"score":0.7110000252723694},{"id":"https://openalex.org/C162319229","wikidata":"https://www.wikidata.org/wiki/Q175263","display_name":"Data structure","level":2,"score":0.6172000169754028},{"id":"https://openalex.org/C138958017","wikidata":"https://www.wikidata.org/wiki/Q190087","display_name":"Data type","level":2,"score":0.5896999835968018},{"id":"https://openalex.org/C2780624054","wikidata":"https://www.wikidata.org/wiki/Q34010","display_name":"Haskell","level":3,"score":0.5837000012397766},{"id":"https://openalex.org/C175971053","wikidata":"https://www.wikidata.org/wiki/Q827335","display_name":"Abstract data type","level":2,"score":0.5202000141143799},{"id":"https://openalex.org/C2780586882","wikidata":"https://www.wikidata.org/wiki/Q7520643","display_name":"Simple (philosophy)","level":2,"score":0.5160999894142151},{"id":"https://openalex.org/C101468663","wikidata":"https://www.wikidata.org/wiki/Q1620158","display_name":"Modular design","level":2,"score":0.44589999318122864},{"id":"https://openalex.org/C80444323","wikidata":"https://www.wikidata.org/wiki/Q2878974","display_name":"Theoretical computer science","level":1,"score":0.4083000123500824},{"id":"https://openalex.org/C56288433","wikidata":"https://www.wikidata.org/wiki/Q58673","display_name":"Data manipulation language","level":2,"score":0.3935999870300293},{"id":"https://openalex.org/C2778112365","wikidata":"https://www.wikidata.org/wiki/Q3511065","display_name":"Sequence (biology)","level":2,"score":0.38679999113082886},{"id":"https://openalex.org/C100463513","wikidata":"https://www.wikidata.org/wiki/Q5227322","display_name":"Data model (GIS)","level":2,"score":0.38609999418258667},{"id":"https://openalex.org/C26713055","wikidata":"https://www.wikidata.org/wiki/Q245962","display_name":"Implementation","level":2,"score":0.3375999927520752},{"id":"https://openalex.org/C67186912","wikidata":"https://www.wikidata.org/wiki/Q367664","display_name":"Data modeling","level":2,"score":0.3361000120639801},{"id":"https://openalex.org/C47487241","wikidata":"https://www.wikidata.org/wiki/Q5227230","display_name":"Data access","level":2,"score":0.32899999618530273},{"id":"https://openalex.org/C168065819","wikidata":"https://www.wikidata.org/wiki/Q845566","display_name":"Debugging","level":2,"score":0.30660000443458557},{"id":"https://openalex.org/C113843644","wikidata":"https://www.wikidata.org/wiki/Q901882","display_name":"Interface (matter)","level":4,"score":0.2955999970436096},{"id":"https://openalex.org/C194207283","wikidata":"https://www.wikidata.org/wiki/Q1172412","display_name":"Data field","level":3,"score":0.29260000586509705},{"id":"https://openalex.org/C19024347","wikidata":"https://www.wikidata.org/wiki/Q211496","display_name":"High-level programming language","level":3,"score":0.29249998927116394},{"id":"https://openalex.org/C2780154230","wikidata":"https://www.wikidata.org/wiki/Q513420","display_name":"Undo","level":2,"score":0.28929999470710754},{"id":"https://openalex.org/C119024030","wikidata":"https://www.wikidata.org/wiki/Q759899","display_name":"Call stack","level":3,"score":0.27880001068115234},{"id":"https://openalex.org/C61423126","wikidata":"https://www.wikidata.org/wiki/Q187432","display_name":"Scripting language","level":2,"score":0.2700999975204468},{"id":"https://openalex.org/C2778029271","wikidata":"https://www.wikidata.org/wiki/Q5421931","display_name":"Extension (predicate logic)","level":2,"score":0.26910001039505005},{"id":"https://openalex.org/C171730128","wikidata":"https://www.wikidata.org/wiki/Q5227290","display_name":"Data file","level":2,"score":0.26669999957084656},{"id":"https://openalex.org/C172367668","wikidata":"https://www.wikidata.org/wiki/Q6504956","display_name":"Data visualization","level":3,"score":0.2583000063896179},{"id":"https://openalex.org/C97250363","wikidata":"https://www.wikidata.org/wiki/Q235557","display_name":"File format","level":2,"score":0.2551000118255615},{"id":"https://openalex.org/C203702819","wikidata":"https://www.wikidata.org/wiki/Q17146953","display_name":"Logical data model","level":3,"score":0.25360000133514404},{"id":"https://openalex.org/C137314826","wikidata":"https://www.wikidata.org/wiki/Q2330408","display_name":"Data mapping","level":2,"score":0.25220000743865967}],"mesh":[],"locations_count":6,"locations":[{"id":"doi:10.22152/programming-journal.org/2017/1/7","is_oa":true,"landing_page_url":"https://doi.org/10.22152/programming-journal.org/2017/1/7","pdf_url":"https://arxiv.org/pdf/1703.10857v1","source":{"id":"https://openalex.org/S4210199781","display_name":"The Art Science and Engineering of Programming","issn_l":"2473-7321","issn":["2473-7321"],"is_oa":false,"is_in_doaj":false,"is_core":true,"host_organization":null,"host_organization_name":null,"host_organization_lineage":[],"host_organization_lineage_names":[],"type":"journal"},"license":null,"license_id":null,"version":"publishedVersion","is_accepted":true,"is_published":true,"raw_source_name":"The Art, Science, and Engineering of Programming","raw_type":"journal-article"},{"id":"pmh:oai:research-information.bris.ac.uk:openaire/769236c0-8076-4759-acdf-453b38dc19bf","is_oa":true,"landing_page_url":"https://research-information.bris.ac.uk/en/publications/769236c0-8076-4759-acdf-453b38dc19bf","pdf_url":null,"source":{"id":"https://openalex.org/S4306400895","display_name":"Bristol Research (University of Bristol)","issn_l":null,"issn":null,"is_oa":false,"is_in_doaj":false,"is_core":false,"host_organization":"https://openalex.org/I36234482","host_organization_name":"University of Bristol","host_organization_lineage":["https://openalex.org/I36234482"],"host_organization_lineage_names":[],"type":"repository"},"license":"cc-by","license_id":"https://openalex.org/licenses/cc-by","version":"publishedVersion","is_accepted":true,"is_published":true,"raw_source_name":"Pickering, M T, Wu, N & Gibbons, J 2017, 'Profunctor Optics : Modular Data Accessors', Art, Science, and Engineering of Programming, vol. 1, no. 2, 7. https://doi.org/10.22152/programming-journal.org/2017/1/7, https://doi.org/10.5281/zenodo.400437","raw_type":"info:eu-repo/semantics/article"},{"id":"pmh:oai:arXiv.org:1703.10857","is_oa":true,"landing_page_url":"http://arxiv.org/abs/1703.10857","pdf_url":"https://arxiv.org/pdf/1703.10857","source":{"id":"https://openalex.org/S4306400194","display_name":"arXiv (Cornell University)","issn_l":"2331-8422","issn":["2331-8422"],"is_oa":true,"is_in_doaj":false,"is_core":false,"host_organization":"https://openalex.org/I205783295","host_organization_name":"Cornell University","host_organization_lineage":["https://openalex.org/I205783295"],"host_organization_lineage_names":[],"type":"repository"},"license":null,"license_id":null,"version":"submittedVersion","is_accepted":false,"is_published":false,"raw_source_name":null,"raw_type":"text"},{"id":"pmh:oai:ora.ox.ac.uk:uuid:9989be57-a045-4504-b9d7-dc93fd508365","is_oa":true,"landing_page_url":"https://ora.ox.ac.uk/objects/uuid:9989be57-a045-4504-b9d7-dc93fd508365","pdf_url":null,"source":{"id":"https://openalex.org/S4306402636","display_name":"Oxford University Research Archive (ORA) (University of Oxford)","issn_l":null,"issn":null,"is_oa":false,"is_in_doaj":false,"is_core":false,"host_organization":"https://openalex.org/I40120149","host_organization_name":"University of Oxford","host_organization_lineage":["https://openalex.org/I40120149"],"host_organization_lineage_names":[],"type":"repository"},"license":"cc-by","license_id":"https://openalex.org/licenses/cc-by","version":"submittedVersion","is_accepted":false,"is_published":false,"raw_source_name":"","raw_type":"Journal article"},{"id":"pmh:oai:research-information.bris.ac.uk:openaire_cris_publications/769236c0-8076-4759-acdf-453b38dc19bf","is_oa":true,"landing_page_url":"https://hdl.handle.net/1983/769236c0-8076-4759-acdf-453b38dc19bf","pdf_url":null,"source":{"id":"https://openalex.org/S4306400895","display_name":"Bristol Research (University of Bristol)","issn_l":null,"issn":null,"is_oa":false,"is_in_doaj":false,"is_core":false,"host_organization":"https://openalex.org/I36234482","host_organization_name":"University of Bristol","host_organization_lineage":["https://openalex.org/I36234482"],"host_organization_lineage_names":[],"type":"repository"},"license":"cc-by","license_id":"https://openalex.org/licenses/cc-by","version":"submittedVersion","is_accepted":false,"is_published":false,"raw_source_name":"Pickering, M T, Wu, N & Gibbons, J 2017, 'Profunctor Optics : Modular Data Accessors', Art, Science, and Engineering of Programming, vol. 1, no. 2, 7. https://doi.org/10.22152/programming-journal.org/2017/1/7, https://doi.org/10.5281/zenodo.400437","raw_type":"info:eu-repo/semantics/article"},{"id":"pmh:oai:spiral.imperial.ac.uk:10044/1/72035","is_oa":true,"landing_page_url":"http://hdl.handle.net/10044/1/72035","pdf_url":null,"source":{"id":"https://openalex.org/S4306401396","display_name":"Spiral (Imperial College London)","issn_l":null,"issn":null,"is_oa":false,"is_in_doaj":false,"is_core":false,"host_organization":"https://openalex.org/I47508984","host_organization_name":"Imperial College London","host_organization_lineage":["https://openalex.org/I47508984"],"host_organization_lineage_names":[],"type":"repository"},"license":"cc-by","license_id":"https://openalex.org/licenses/cc-by","version":"submittedVersion","is_accepted":false,"is_published":false,"raw_source_name":"7-51","raw_type":"Journal Article"}],"best_oa_location":{"id":"doi:10.22152/programming-journal.org/2017/1/7","is_oa":true,"landing_page_url":"https://doi.org/10.22152/programming-journal.org/2017/1/7","pdf_url":"https://arxiv.org/pdf/1703.10857v1","source":{"id":"https://openalex.org/S4210199781","display_name":"The Art Science and Engineering of Programming","issn_l":"2473-7321","issn":["2473-7321"],"is_oa":false,"is_in_doaj":false,"is_core":true,"host_organization":null,"host_organization_name":null,"host_organization_lineage":[],"host_organization_lineage_names":[],"type":"journal"},"license":null,"license_id":null,"version":"publishedVersion","is_accepted":true,"is_published":true,"raw_source_name":"The Art, Science, and Engineering of Programming","raw_type":"journal-article"},"sustainable_development_goals":[],"awards":[{"id":"https://openalex.org/G2022461531","display_name":null,"funder_award_id":"EP/K020919/1","funder_id":"https://openalex.org/F4320334627","funder_display_name":"Engineering and Physical Sciences Research Council"}],"funders":[{"id":"https://openalex.org/F4320314997","display_name":"Strong","ror":"https://ror.org/041vyzr56"},{"id":"https://openalex.org/F4320334627","display_name":"Engineering and Physical Sciences Research Council","ror":"https://ror.org/0439y7842"}],"has_content":{"pdf":true,"grobid_xml":true},"content_urls":{"pdf":"https://content.openalex.org/works/W2601103017.pdf","grobid_xml":"https://content.openalex.org/works/W2601103017.grobid-xml"},"referenced_works_count":0,"referenced_works":[],"related_works":[],"abstract_inverted_index":{"&lt;p&gt;Data":[0],"accessors":[1,33,50,84,96,133,157,171,177],"allow":[2],"one":[3,104,124],"to":[4,42,57,74,106,130,166,234,305,317],"read":[5],"and":[6,65,214,282],"write":[7,107],"components":[8,326],"of":[9,17,22,28,63,93,100,110,188,193,211,257,264,320,327],"a":[10,18,23,29,80,86,108,127,147,190,230,265],"data":[11,32,49,53,76,83,88,95,121,132,151,156,160,170,174,329],"structure,":[12,122],"such":[13,79,241],"as":[14,37,61,229,242,252],"the":[15,20,26,98,120,186,246,262,268,272,276,280,283,294,306,315,325],"fields":[16],"record,":[19],"variants":[21],"union,":[24],"or":[25,112,203,208,224],"elements":[27],"container.":[30],"These":[31],"are":[34,40,55,90,134,199,302],"collectively":[35],"known":[36],"optics;":[38],"they":[39],"fundamental":[41],"programs":[43,322],"that":[44,82,101,114,244,298,323],"manipulate":[45],"complex":[46,169],"data.":[47],"Individual":[48],"for":[51,59,85,97,149,158,172,217,271,279,289],"simple":[52,159],"structures":[54,161],"easy":[56],"write,":[58],"example":[60],"pairs":[62],"\u2018getter\u2019":[64],"\u2018setter\u2019":[66],"methods.":[67],"However,":[68],"it":[69],"is":[70,129,183,274,286],"not":[71,136],"obvious":[72],"how":[73],"combine":[75],"accessors,":[77],"in":[78,140,153,232,261],"way":[81,316],"compound":[87,173,328],"structure":[89],"composed":[91],"out":[92],"smaller":[94],"parts":[99],"structure.":[102],"Generally,":[103],"has":[105],"sequence":[109],"statements":[111],"declarations":[113],"navigate":[115],"step":[116,118],"by":[117],"through":[119],"accessing":[123],"level":[125],"at":[126],"time\u2014which":[128],"say,":[131],"traditionally":[135],"first-class":[137,179],"citizens,":[138],"combinable":[139],"their":[141],"own":[142],"right.&lt;/p&gt;":[143],"&lt;br/&gt;":[144],"&lt;p&gt;We":[145],"present":[146,235],"framework":[148,182],"modular":[150],"access,":[152],"which":[154,233],"individual":[155],"may":[162],"be":[163],"freely":[164],"combined":[165],"obtain":[167],"more":[168,307],"structures.":[175],"Data":[176],"become":[178],"citizens.":[180],"The":[181,195],"based":[184],"around":[185],"notion":[187],"profunctors,":[189],"flexible":[191],"generalization":[192],"functions.":[194],"language":[196],"features":[197,248],"required":[198],"higher-order":[200],"functions":[201],"(\u2018lambdas\u2019":[202],"\u2018closures\u2019),":[204],"parametrized":[205],"types":[206],"(\u2018generics\u2019":[207],"\u2018abstract":[209],"types\u2019)":[210],"higher":[212],"kind,":[213],"some":[215],"mechanism":[216],"separating":[218],"interfaces":[219],"from":[220],"implementations":[221,256],"(\u2018abstract":[222],"classes\u2019":[223],"\u2018modules\u2019).":[225],"We":[226,254,291],"use":[227],"Haskell":[228],"vehicle":[231],"our":[236,259,299],"constructions,":[237,260],"but":[238],"other":[239],"languages":[240],"Scala":[243],"provide":[245,255],"necessary":[247],"should":[249,313],"work":[250],"just":[251],"well.":[253],"all":[258],"form":[263],"literate":[266],"program:":[267],"manuscript":[269],"file":[270],"paper":[273],"also":[275,292],"source":[277],"code":[278,285],"program,":[281],"extracted":[284],"available":[287],"separately":[288],"evaluation.":[290],"prove":[293],"essential":[295],"properties,":[296],"demonstrating":[297],"profunctor-based":[300],"representations":[301],"precisely":[303],"equivalent":[304],"familiar":[308],"concrete":[309],"representations.":[310],"Our":[311],"results":[312],"pave":[314],"simpler":[318],"ways":[319],"writing":[321],"access":[324],"structures.&lt;/p&gt;":[330]},"counts_by_year":[{"year":2026,"cited_by_count":4},{"year":2025,"cited_by_count":2},{"year":2024,"cited_by_count":3},{"year":2023,"cited_by_count":5},{"year":2022,"cited_by_count":2},{"year":2021,"cited_by_count":3},{"year":2020,"cited_by_count":3},{"year":2019,"cited_by_count":3},{"year":2018,"cited_by_count":3}],"updated_date":"2026-07-28T07:46:37.118299","created_date":"2017-04-07T00:00:00"}
