{
"$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"
}