Compilation 为什么Mü;nster编译器相信跨++;这是不确定的吗?

Compilation 为什么Mü;nster编译器相信跨++;这是不确定的吗?,compilation,functional-programming,logic-programming,declarative-programming,curry,Compilation,Functional Programming,Logic Programming,Declarative Programming,Curry,我最近安装了Münster Curry编译器来替换我正在使用的速度慢得多的PAKCS。我想测试的第一件事是我是否可以使用PAKCS中的一些模式匹配功能,因为我知道一些实现(我想到的是Sloth)不支持PAKCS允许的所有模式匹配。因此,我编写了以下程序: import IO f (a ++ [b]) = a main = print $ f $ "Hello, World!" 这在PAKCS中工作,并按预期打印出Hello,World,但在使用MCC编译时,我得到错误: Error: ca

我最近安装了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为什么选择此错误<代码>无法复制世界通常意味着IO依赖于非确定性行为。这让我怀疑MCC认为我的函数
f
是不确定的。然而,据我所知,
f
是完全确定的

MCC在做什么使它认为我的函数是不确定的

我不需要知道如何修复该程序,这非常简单,以下方法有效:

import IO

f (a : b @ (_:_)) = a : f b
f [a] = []

main = print $ f $ "Hello, World!"

我感兴趣的是了解编译器在这里做了什么导致它出错,以及这与PAKCS编译代码时的不同之处。

关于MCC,我不太清楚,但PAKCS将函数模式转换为(高度)非确定性表达式。观察到的行为归结为在IO中使用非确定性计算时MCC和PAKCS的不同行为。在PAKCS中,对非确定性计算进行求值,只有当表达式求值为多个结果时,才会发生运行时错误

也就是说,您可以在PAKCS中执行以下操作,而不会出现运行时错误

REPL> putStrLn ("Hello" ? failed)
"Hello"
但是,以下计算将产生(相当晚的)运行时错误

REPL> putStrLn ("Hello" ? "Hello")
Hello
Hello
ERROR: non-determinism in I/O actions occurred!
我猜MCC对非确定性计算进行了不同的(更合理的)检查

结尾的一些广告:我通常与……一起工作,你使用MCC的具体原因是什么

编辑:如果您想了解更多关于功能模式及其实现的信息,您可能应该看看下面的文章


感谢您的回复!这有助于澄清一些事情。至于使用MCC,我想使用KiCS2,我只是在编译时遇到了一些问题,所以我想我应该尝试使用MCC。如果您更感兴趣的是为什么使用函数模式的定义是不确定的,我添加了一篇文章,解释了PAKCS的实现。关于KiCS2的问题,请随时与我联系;)