haskell mutual-recursion

Haskell deja que la expresión converja, mientras que una expresión similar que usa fix no lo hace



mutual-recursion (1)

De forma predeterminada, los patrones más externos utilizados en los enlaces let son perezosos. Sin embargo, los patrones utilizados en los enlaces de lambda son estrictos, por lo que la coincidencia del patrón contra la tupla fuerza demasiado pronto. Puede escribir explícitamente una coincidencia de patrón diferido prefijándola con ~ , haciendo que el patrón lambda sea equivalente al patrón let :

ghci> fix (/(~(x, y)) -> (y, 1)) (1,1)

Esto difiere la evaluación real de la coincidencia del patrón hasta que se fuerza una de las variables enlazadas, en lugar de cuando se llama a la función, evitando el bucle.

Para obtener más información, consulte el artículo de la wiki de Haskell sobre patrones perezosos .

He tenido dificultades para entender por qué la expresión haskell let (x,y) = (y,1) in (x,y) converja a (1,1) como se esperaba, pero fix (/(x,y)-> (y,1)) da como resultado <<loop>> ser lanzado. ¿Alguien puede explicar esto?