Julia:函数的偶数数据类型



我有大约50个函数,它们应该只使用偶数正数。现在,我每次都用"如果"来检查输入的数字是否为零:

function grof(x::Int)
if (x % 2) == 0
println("good")
else
throw("x is not an even number!!!!!!!!!!!!! Stupid programmer!")
end
end

理想情况下,我希望有一个自动生成的数据类型,即

function grof(x::EvenInt)
println("good")  
end

然而,由于我无法理解这部纪录片,我无法自己制作这种数据类型。谢谢你的帮助!

Best诉

在这种情况下,我不认为创建类型是有必要的:我只需要@assert,即在函数开始时验证条件。(有趣的是,检查一个数字是否为偶数是文档中选择的示例,以说明@assert的效果(

例如:

julia> function grof(x::Int)
@assert iseven(x) "Stupid programmer!"
println("good")
end
grof (generic function with 1 method)
julia> grof(2)
good
julia> grof(3)
ERROR: AssertionError: Stupid programmer!
Stacktrace:
[1] grof(::Int64) at ./REPL[5]:2
[2] top-level scope at REPL[7]:1




编辑:如果真的想要创建一个强制执行此类约束的类型,这是可能的。这样做的方法是

  1. 创建一个类型(可能是Number抽象类型之一的子类型;可能是Signed(
  2. 定义一个内部构造函数,确保此类类型不能包含奇值

一个非常简单的例子是:

# A wrapper around an even integer value
struct EvenInt
val :: Int
# inner constructor
function EvenInt(val)
@assert iseven(val)
new(val)
end
end
# Accessor to the value of an EvenInt
val(x::EvenInt) = x.val
# A method working only on even numbers
grof(x::EvenInt) = println("good: $(val(x)) is even")

你会这样使用:

julia> x = EvenInt(42)
EvenInt(42)
julia> grof(x)
good: 42 is even
julia> y = EvenInt(1)
ERROR: AssertionError: iseven(val)
Stacktrace:
[1] EvenInt(::Int64) at ./REPL[1]:5
[2] top-level scope at REPL[6]:1

但请注意,您还不能对EvenInts执行任何操作:您需要打开它们(在本例中使用val()(,或者定义对它们的操作(如果您将EvenInt作为抽象数字类型之一的子类型并遵循相关接口,则可以大大简化此任务(。

所有整数乘以2都是偶数,因此重新定义函数,使其取当前数的一半。

function grof2(halfx::Int)
x=2*halfx
println("good")
end

最新更新