{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreif5z6qsgtl4vlwqpfuihfwhfds2vkxvvxf43zijyzgkepopocimla",
    "uri": "at://did:plc:pi6woz4d47bkuws673w2il2r/app.bsky.feed.post/3mn6hxp5khzr2"
  },
  "path": "/t/homomorphic-static-analysis/14146#post_12",
  "publishedAt": "2026-05-31T21:06:16.000Z",
  "site": "https://discourse.haskell.org",
  "textContent": "Hi!\n\nNice question! And I need to admit that I don’t have a clear answer.\n\nJust two thoughts:\n\n  1. We wouldn’t have this issue if `Strong` was defined in terms of `***` instead of `first'` and `second'` (and similarly for `Choice` defined in terms of `+++`).\n  2. One potential solution to the issue is to have an intermediate step to a data structure like\n\n\n\n\n    data StrongData a b =\n      Fun :: (a -> b) -> Fun a b\n      Compose :: Fun b c -> Fun a b -> Fun c d\n      DiMap :: ...\n      First :: Fun a b -> Fun (a, c) (b, c)\n      Second :: Fun a b -> Fun (c, a) (c, b)\n\n\nand every time you have a `Compose (First ...) (Second ...)` you optimize it to a parallel computation\n",
  "title": "Homomorphic static analysis"
}