代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Benjamin Brown

用咖喱语言指定默认规则:为什么和如何?

  •  0
  • Jeffrey Benjamin Brown  · 技术社区  · 6 年前

    第3.5.6节 Curry tutorial (pdf) 我们建议使用默认规则“在搜索失败后重新获得控制权”。下面给出一个例子。(为了清楚起见,我添加了一个类型签名并对输入进行了循环。)

    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>
    

    '默认值 自从编写教程以来语法发生了变化?它全部被移走了吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Sergio Antoy    6 年前

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

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

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

        2
  •  1
  •   Michael Hanus    6 年前

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

    权限错误是由于以下事实造成的:并非所有可能的 curry程序的中间表示是预编译的 在Ubuntu包中。不幸的是,“默认规则转换器” of currypp需要这些中间表示之一。

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

    推荐文章