pri*_*tor 6 lazy-evaluation nothing optional julia
我对 Julia 很陌生,但我对 Scheme/Rust/F# 有一定的了解。
今天我想让昨天的 AoC更好,而不需要明确数量的嵌套循环。
我找到了这个可行的解决方案,但我不喜欢最后一个if. 在上面提到的语言中,我会调用一个函数(或使用计算表达式),它给我的第一个结果不是None. 对于朱莉娅,我期望的东西做的。它确实如此,但出乎意料地以一种热切的方式出现。
所以当我尝试时return something(find(r, n, start + 1, which), find(r, n - 1, start + 1, extended)),当第一个参数已经有结果时,它也会评估第二个参数 - 因此崩溃。
是否有宏/懒惰版本或something我没有找到?遇到这样的案子该怎么办?
我也想过(短路)或将它们放在一起,但我猜朱莉娅在这件事上的严格破坏了这一点。
using DataStructures
function find(r::Array{Int}, n, start = 1, which = nil())::Union{Int,Nothing}
if start <= length(r)
extended = cons(start, which)
with_current = sum(i -> r[i], extended)
if with_current == 2020 && n == 1
return prod(i -> r[i], extended)
else
# Unfortunately no :(
#return something(find(r, n, start + 1, which), find(r, n - 1, start + 1, extended))
re = find(r, n, start + 1, which)
if isnothing(re)
return find(r, n - 1, start + 1, extended)
else
re
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
让我更多地评论一下为什么鉴于评论中的讨论这是不可能的。
在 Julia 中,函数参数会被急切求值,因此 Julia 在将它们传递给函数之前先求值find(r, n, start + 1, which)和。find(r, n - 1, start + 1, extended)something
现在,有了宏(为了简单起见,我没有在完全通用的情况下编写,我希望我的卫生是正确的:)):
julia> macro something(x, y)
quote
local vx = $(esc(x))
isnothing(vx) ? $(esc(y)) : vx
end
end
@something (macro with 1 method)
julia> @something 1 2
1
julia> @something nothing 2
2
julia> @something 1 sqrt(-1)
1
julia> @something nothing sqrt(-1)
ERROR: DomainError with -1.0:
sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Run Code Online (Sandbox Code Playgroud)
(在宏可变参数的完整版本中,Some应该进行处理以something准确复制)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |