<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.3.3">Jekyll</generator><link href="https://www.harrisongrodin.com/feed.xml" rel="self" type="application/atom+xml"/><link href="https://www.harrisongrodin.com/" rel="alternate" type="text/html" hreflang="en"/><updated>2026-04-13T02:53:35+00:00</updated><id>https://www.harrisongrodin.com/feed.xml</id><title type="html">blank</title><entry><title type="html">Amortized Analysis as a Cost-Aware Abstraction Function</title><link href="https://www.harrisongrodin.com/blog/2025/amortized-abstraction/" rel="alternate" type="text/html" title="Amortized Analysis as a Cost-Aware Abstraction Function"/><published>2025-05-14T00:00:00+00:00</published><updated>2025-05-14T00:00:00+00:00</updated><id>https://www.harrisongrodin.com/blog/2025/amortized-abstraction</id><content type="html" xml:base="https://www.harrisongrodin.com/blog/2025/amortized-abstraction/"><![CDATA[]]></content><author><name></name></author><category term="cost analysis"/><category term="category theory"/><category term="programming languages"/><category term="algorithms and data structures"/><summary type="html"><![CDATA[Data structures contain two important aspects that computer scientists seek to verify: behavior and cost. The behavior of data structures has long been studied using abstraction functions, which translate concrete data structure representations into a semantic representation. On the other hand, the cost associated with data structures has been analyzed using the method of amortization, a technique in which cost is studied in aggregate: rather than considering the maximum cost of a single operation, one bounds the total cost encountered throughout a sequence of operations. In this post, I will demonstrate how to unify these two techniques, packaging the data associated with an amortized analysis as an abstraction function that incorporates cost. This reframing is more amenable to formal verification, consolidates prior variations of amortized analysis, and generalizes amortization to novel settings.]]></summary></entry><entry><title type="html">Poly-morphic effect handlers</title><link href="https://www.harrisongrodin.com/blog/2024/poly-morphic-effect-handlers/" rel="alternate" type="text/html" title="Poly-morphic effect handlers"/><published>2024-01-03T00:00:00+00:00</published><updated>2024-01-03T00:00:00+00:00</updated><id>https://www.harrisongrodin.com/blog/2024/poly-morphic-effect-handlers</id><content type="html" xml:base="https://www.harrisongrodin.com/blog/2024/poly-morphic-effect-handlers/"><![CDATA[]]></content><author><name></name></author><category term="polynomial functors"/><category term="algebraic effects"/><category term="category theory"/><category term="programming languages"/><summary type="html"><![CDATA[In computer science, programmers often perform effects to interact with the surrounding environment. For example, a program may print strings or interact with mutable state. Then, effects may be handled, implemented in terms of other effects. In this post, we reconstruct a categorical semantics for programs with effects, and we isolate a class of composable effect handlers that may be concisely described in the language of polynomial functors, the free monad monad, and the Grothendieck construction.]]></summary></entry><entry><title type="html">Recursive Types via Domain Theory</title><link href="https://www.harrisongrodin.com/blog/2023/recursive-types/" rel="alternate" type="text/html" title="Recursive Types via Domain Theory"/><published>2023-01-10T00:00:00+00:00</published><updated>2023-01-10T00:00:00+00:00</updated><id>https://www.harrisongrodin.com/blog/2023/recursive-types</id><content type="html" xml:base="https://www.harrisongrodin.com/blog/2023/recursive-types/"><![CDATA[]]></content><author><name></name></author><category term="domain theory"/><category term="category theory"/><category term="programming languages"/><category term="lambda calculus"/><summary type="html"><![CDATA[Functional programming languages often include recursive types, allowing programmers to define types satisfying a given isomorphism. Such types cannot all be interpreted as sets, but they can be understood using domain theory. We consolidate and present foundational techniques in domain theory to understand eager programming languages with recursive types from a categorical perspective. We define a category of domains with finite coproducts, a symmetric monoidal closed structure for eager products and functions, and least solutions of recursive domain equations, whose objects are retracts of a universal space and whose morphisms are continuous with respect to a topology of approximations.]]></summary></entry><entry><title type="html">Serializing to JSON in SML/NJ</title><link href="https://www.harrisongrodin.com/blog/2020/smlnj-json/" rel="alternate" type="text/html" title="Serializing to JSON in SML/NJ"/><published>2020-05-29T00:00:00+00:00</published><updated>2020-05-29T00:00:00+00:00</updated><id>https://www.harrisongrodin.com/blog/2020/smlnj-json</id><content type="html" xml:base="https://www.harrisongrodin.com/blog/2020/smlnj-json/"><![CDATA[]]></content><author><name></name></author><category term="Standard ML"/><summary type="html"><![CDATA[The SML/NJ standard library includes utilities for working with JSON. In this post, we outline the essentials and demonstrate simple usage examples.]]></summary></entry></feed>