【问题标题】:Erlang Pattern-Matching boolean exampleErlang 模式匹配布尔示例
【发布时间】:2013-09-23 18:27:18
【问题描述】:

我想学习 Erlang,在书中我有练习: 编写一个模块 boolean.erl,它接受逻辑表达式和布尔值(表示 作为原子真假)并返回它们的布尔结果。功能 你写的应该包括 b_not/1、b_and/2、b_or/2 和 b_nand/2。你不应该使用 逻辑结构和,或,而不是,而是使用模式匹配来实现你的 目标。 从外壳测试您的模块。调用导出函数的一些示例 您的模块包括:

bool:b_not(false) ⇒ true
bool:b_and(false, true) ⇒ false
bool:b_and(bool:b_not(bool:b_and(true, false)), true) ⇒ true.

所以到目前为止我想出的最佳解决方案是:

-module(b).

-export([b_not/1,b_and/2,b_or/2]).


b_not(false) -> false /= true.
%%%
b_and(false, false) -> false;
b_and(X, Y) -> X == Y.    
%%%
b_or(true, true) -> true;
b_or(X, Y) -> X /= Y.

最后一个例子怎么解决,我真的不明白。有什么帮助吗? 谢谢。

【问题讨论】:

    标签: erlang pattern-matching


    【解决方案1】:

    我有点不同意@hdima 所说的话。本练习的目标练习模式匹配而不使用任何运算符。模式匹配的最佳方法是写下每个案例。那么对于b_or,参数的不同可能情况是什么?有4个:truetruetruefalsefalsetrue;和falsefalse。所以只需将每个案例写成一个单独的子句,返回正确的值:

    b_or(true, true) -> true;
    b_or(true, false) -> true;
    b_or(false, true) -> true;
    b_or(false, false) -> false.
    

    所以看看这个答案,你可能会想得很好,因为很多情况都是一样的,为什么不优化这个:

    b_or(false, false) -> false;
    b_or(_, _) -> true.
    

    _don't care 变量,它匹配任何东西并且永远不会被绑定。好吧,如果使用布尔值调用,两个版本的行为相同但是如果使用非布尔值调用,它们的行为会有所不同。在这种情况下,第二个返回 true 而第一个生成异常。通常最好在输入错误时生成异常,而不是让它通过并返回误导性答案,因此第一种选择是更好的解决方案。

    b_and(和b_xor)留给你。

    对不起,如果这有点长,但模式匹配可能需要一些时间来适应。写下您的期望而不是如何测试它的概念与 OO 和命令式语言中常见的概念不同。 (我提供课程,这是一个常见的障碍)

    【讨论】:

    • 谢谢,这真的很有帮助而且很清楚。使用“_”也是一个很好的提示。
    • 这实际上与我的想法完全相同,但我不想完全破坏解决方案。现在它只是一个复制/粘贴练习。 ;)
    • @hdima 啊,但还有b_andb_xor 要做。 :-)
    【解决方案2】:

    如果您仅限于模式匹配,b_not/1 应该如下所示:

    b_not(false) -> true;
    b_not(true) -> false.
    

    尝试将此想法用于其他功能。

    提示:对于其他功能,您不需要为每种可能的情况编写子句。

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 2023-03-26
      • 2018-12-08
      • 2011-08-14
      • 2011-06-17
      • 2013-08-15
      • 2011-09-29
      • 2010-12-13
      • 2014-07-26
      相关资源
      最近更新 更多