Недавно я установил компилятор Münster Curry, чтобы заменить гораздо более медленный PAKCS, который я использовал. Первое, что я хотел проверить, это то, могу ли я использовать некоторые функции сопоставления шаблонов из PAKCS, потому что я знаю, что некоторые реализации (на ум приходит Sloth) не поддерживают все сопоставления шаблонов, которые допускает PAKCS. Поэтому я написал следующую программу:
import IO
f (a ++ [b]) = a
main = print $ f $ "Hello, World!"
Это работает в PAKCS и печатает Hello, World
, как и ожидалось, но при компиляции с MCC я получаю сообщение об ошибке:
Error: cannot duplicate the world
Насколько я понимаю, это означает, что MCC не может сопоставлять шаблоны в ++
, но я не понимаю, почему MCC выбирает эту ошибку. cannot duplicate the world
обычно означает, что ввод-вывод зависит от недетерминированного поведения. Это заставляет меня подозревать, что MCC считает мою функцию f
недетерминированной. Однако, насколько мне известно, f
полностью детерминирован.
Что делает MCC, из-за чего он считает мою функцию недетерминированной?
Мне не нужно знать, как исправить программу, это очень просто, работает следующее:
import IO
f (a : b @ (_:_)) = a : f b
f [a] = []
main = print $ f $ "Hello, World!"
Мне интересно понять, что здесь делает компилятор, что приводит к ошибке, и чем это отличается от того, что делает PAKCS при компиляции кода.