指定Curry语言中的默认规则:为什么以及如何指定



在Curry教程(pdf(的第3.5.6节中,建议我们使用默认规则"在搜索失败后重新获得控制权"。下面给出了一个例子。(为了清晰起见,我添加了一个类型签名,并对输入进行了验证。(

lookup :: k -> [(k,v)] -> Maybe v
lookup key (_++[(key,value)]++_ ) = Just value
lookup’default _ _ = Nothing

除非用'替换,否则我无法编译它。一旦我这样做了,它的行为是这样的:

test> test.lookup 1 [(2,3)]
*** No value found!

问题1:默认声明是什么

为什么你需要指定一个特定的条款是默认条款?一旦其他人失败了,它不会以这样或那样的方式到来吗?

问题2:它是怎么写的?它应该写出来吗

如果我放弃了字符串'default:

lookup :: k -> [(k,v)] -> Maybe v
lookup key (_++[(key,value)]++_ ) = Just value
lookup _ _ = Nothing

它的行为符合预期:

test> test.lookup 1 [(2,3)]
Nothing
test>

自编写教程以来,'default语法是否发生了变化?它被完全移除了吗?

这是您要查找的代码。您的缺少允许默认规则的预处理器指令。并且使用了错误的引号字符。

-- Use default rules
{-# OPTIONS_CYMAKE -F --pgmF=currypp --optF=defaultrules #-}
lookup :: k -> [(k,v)] -> Maybe v
lookup key (_++[(key,value)]++_ ) = Just value
lookup'default _ _ = Nothing
test_positive = lookup 2 [(2,3)] == Just 3
test_negative = lookup 1 [(2,3)] == Nothing

默认规则有多种用途。在搜索失败后重新获得控制是一个特别有用的方法,因为您不能用相等的方式检查表达式是否失败。

如果删除选项"-F",则不会调用解释行为的预处理器。

权限错误是由于并非所有可能Curry程序的中间表示是预先编译的在Ubuntu软件包中。不幸的是,"默认规则翻译器"CurryPP需要这些中间表示之一。

Ubuntu/Debian软件包仅用于使用咖喱仁。对于扩展和更高级的工具,我建议手动安装PAKCS,例如https://www.informatik.uni-kiel.de/~pakcs/download.html如果你已经有了Ubuntu,那么一个简单的make就足够了。

最新更新