用Curry语言指定默认规则:为什么以及如何做?

时间:2018-11-18 02:24:52

标签: operator-precedence curry

Curry tutorial (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语法是否已更改?完全删除了吗?

2 个答案:

答案 0 :(得分:1)

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

-- 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

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

答案 1 :(得分:1)

如果删除选项“ -F”,则不会调用预处理器来解释该行为。

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

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