我最近安装了 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
通常意味着 IO 依赖于非确定性行为。这让我怀疑 MCC 认为我的函数f
是不确定的。然而,据我所知,这f
是完全确定的。
MCC 做了什么导致它认为我的函数是不确定的?
我不需要知道如何修复程序,这真的很容易,以下工作:
import IO
f (a : b @ (_:_)) = a : f b
f [a] = []
main = print $ f $ "Hello, World!"
我有兴趣了解编译器在此处执行的操作导致其出错,以及这与 PAKCS 在编译代码时的操作有何不同。