gpt4 book ai didi

Erlang 模式匹配 bool 示例

转载 作者:行者123 更新时间:2023-12-02 06:30:07 25 4
gpt4 key购买 nike

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

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.

最后一个例子怎么解,实在不明白。有什么帮助吗?谢谢。

最佳答案

我有点不同意@hdima 的说法。此练习的目标练习模式匹配而不使用任何运算符。模式匹配的最佳方法是写下每个案例。那么对于 b_or 参数可能有哪些不同的情况?有4种:truetrue;和。因此,只需将每种情况写为返回正确值的单独子句即可:

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.

_不关心变量,它匹配任何内容并且永远不会被绑定(bind)。好吧,如果使用 bool 值调用,两个版本的行为都是相同的但是,如果使用非 bool 值调用,它们的行为会有所不同。在这种情况下,第二个返回 true,而第一个则生成异常。通常,最好在错误输入时生成异常,而不是让它通过并返回误导性的答案,因此第一个替代方案是更好的解决方案。

编写b_and(和b_xor)由您决定。

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

关于Erlang 模式匹配 bool 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18881653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com