【问题标题】:Specifying default rules in the Curry language: Why and how?在 Curry 语言中指定默认规则:为什么以及如何?
【发布时间】:2018-11-23 16:33:48
【问题描述】:

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 语法是否发生了变化?是否已完全删除?

【问题讨论】:

    标签: operator-precedence curry


    【解决方案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
    

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

    【讨论】:

    • 那条OPTIONS 行给了我错误,直到我从中删除了-F。现在它编译了,但我没有检测到效果。我可以使用规则myLookup _ _ = Nothing 定义myLookupPrelude.lookup 似乎会掩盖它,如果我使用名称lookup),或者我可以改用规则myLookup'default _ _ = Nothing,但在这两种情况下我都会得到相同的行为:在 REPL 中,myLookup 1 [(1,2)] 首先产生 Just 1,然后是 Nothing,而 myLookup 2 [(1,2)] 产生单个值 Nothing。 (我正在运行 PAKCS,版本 2.0.1-1,通过 apt 在 Ubuntu 18.04 上安装。)
    • 请检查您的路径中是否有可执行文件currypp。据我所知,它与您的 Curry 安装一起提供,但我不完全确定。
    • 我试过cypm update && cypm install currypp,模仿这个advice,安装了currypp。从pakcs repl 加载test.curry 现在会生成这个error。我正在使用“带有类型类的 PAKCS 版本 2”,按照说明安装 here
    • 根据my mailing list post 的回复,我运行apt remote pakcs,然后通过制作pakcs-2.0.2-amd64-Linux.tar.gz 进行安装。 currypp 仍然是从 apt 版本的 pakcs 安装的。那不好吗? test.curry 现在生成 "no frontend" error
    • 由于 tar.gz 版本可能安装在某个本地目录中,因此您必须重新安装 currypp。此外,pakcs/bin 目录应该在你的路径中,这样 currypp 才能找到前端。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2017-06-02
      相关资源
      最近更新 更多