在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!
为什么需要指定一个特定的子句为默认子句?一旦其他方法失败,它会以一种或另一种方式到达吗?
相反,如果我删除字符串'default
:
lookup :: k -> [(k,v)] -> Maybe v
lookup key (_++[(key,value)]++_ ) = Just value
lookup _ _ = Nothing
它的行为符合预期:
test> test.lookup 1 [(2,3)]
Nothing
test>
自编写本教程以来,'default
语法是否已更改?完全删除了吗?
答案 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
就足够了。