我正在学习Erlang
和其中一个问题,按照Joe
的书中的状态
如果X是偶数,函数even(X)应返回true,否则返回false。如果X是奇数,函数odd(X)应返回true。
我解决这个问题的方法是
-module(math_functions).
%% API
-export([even/1, odd/1]).
even(Integer) -> (Integer >= 0) and (Integer rem 2 =:= 0).
odd(Integer) -> (Integer >= 1) and (Integer rem 2 =/= 0).
并将其作为
Eshell V6.2 (abort with ^G)
1> math_functions:odd(13).
true
2> math_functions:odd(-13).
false
3> math_functions:odd(1).
true
4> math_functions:even(1).
false
5> math_functions:even(2).
true
6> math_functions:even(-2).
false
7>
我的问题是是否有更好的方法来做到这一点
谢谢
3条答案
按热度按时间0g0grzrc1#
你可以使用guards来限制自己只能使用大于或等于零的整数,然后按照问题注解中的建议检查最低有效位。你也可以用
even/1
来定义odd/1
:guards是函数头的一部分,因此如果调用
even(-1)
,它将无法以与调用even(1, 2)
完全相同的方式进行匹配(即,使用错误的参数数量)。jv4diomz2#
回答白日梦者关于史蒂夫回答的评论。
当你编写一个函数时,Erlang中的一个常见用法是只对“成功”的情况进行编码,而让crash对不成功的情况进行编码(我稍后会回来解释为什么这很重要)。
另一个对任何语言都有效的标准是,当有人使用或阅读您的代码时,避免出现意外。
在你的一条评论中,你说你想写的奇函数和偶函数被限制为正整数或空整数(我不会讨论这个选择,至少奇函数和偶函数被限制为整数),这意味着你必须问自己第一个问题:如果使用错误的参数调用函数,函数的行为是什么。
首选:让它崩溃这是史蒂夫的主张:这个函数只有在正确的参数下才能工作。2我总是喜欢这个解决方案。3唯一的例外是如果我不掌握输入参数,例如如果它们直接来自一个文件,一个用户界面...那么我更喜欢第三种选择。
第二选择:返回结果这是您选择:返回false。从逻辑的Angular 来看,对于奇函数和偶函数,返回false是有效的:is something is not true,it is false:o).我不喜欢这个解决方案有两个原因.第一个原因是,它不是一个可以很容易地推广到布尔答案以外的东西.第二个也是对我来说更重要的一个原因是,它可能会让用户感到惊讶.当函数odd(N)返回false时,认为N是偶数是合理的,而在这种情况下,odd(-2)和even(-2)都将返回false.
第三选择:返回一个带标记结果这是您在Erlang中经常看到的内容:一个函数返回{ok,Value}或{Error,Term}。这样做可以让调用函数选择管理或不管理错误参数。Error变量可以让你有明确的错误消息,对调试和用户界面都很有用。在你的例子中,代码变成:
在编程时,尽快检测到错误是很重要的,在Erlang中更是如此。如果一个进程没有检测到(并且最简单的检测是崩溃)和错误并且通过消息传播一些无效信息,可能很难找到问题的根本原因,忽略发出这个消息的进程(可能是死的)。2只对成功的情况进行编码是一种尽快发现问题的简单方法。
9rbhqvlz3#