Я возился с fix, и после беспорядка с ним я встретил какое-то странное поведение, а именно, что 0 * undefined - *** Exception: Prelude.undefined и undefined * 0 - 0. Это также означает, что fix (0 *) составляет *** Exception: <<loop>>, а fix (* 0) - 0.
После игры с ним кажется, что причина кроется в том, что нетривиально сделать это короткое замыкание в обоих направлениях, поскольку это не имеет особого смысла, без каких-либо странных параллельных вычислений и начинается с первый не-нижний.
Является ли это вид вещей в других местах (рефлексивные функции, которые не являются рефлексивными для нижних значений), и на что я могу надежно полагаться? Также есть практический способ сделать так, чтобы (0 *) и (* 0) оценивались до нуля независимо от переданного значения.