Julia - 为另一个函数的输入指定参数
Julia - Specify arguments to input of another function
我知道在 Julia 中我可以做 parse(BigFloat, x)
,其中 x
可能是一个字符串或 readline()
的结果。但是,如果我想在 parse
函数中为我的 BigFloat
指定精度怎么办?
如你所愿BigFloat(pi, precision = 50)
。
我相信这可以推广到您将函数、构造函数或类型放入另一个函数并且您想要指定前一个函数的参数的情况。
对于一般的构造函数和解析,没有解决方案,因为解析可能需要使用实现细节。但是由于 BigFloat
实现者已经预见到这个用例,构造函数有一个方法采用 AbstractString
和精度:
julia> BigFloat("3.141592653589793238462643383279502884197169399375105820974944592307816406286198")
3.141592653589793238462643383279502884197169399375105820974944592307816406286198
julia> BigFloat("3.141592653589793238462643383279502884197169399375105820974944592307816406286198", precision = 50)
3.1415926535897931
julia> parse(Float64, "3.141592653589793238462643383279502884197169399375105820974944592307816406286198")
3.141592653589793
你想象的概括也是不可能的;我认为你在那里有一个误解。 parse
的第一个参数 不是 被视为可调用对象,而是一种仅用于调度的类型。所以你不能通过传递一个匿名函数来绕过构造:
julia> parse(f -> BigFloat(f, precision=50), "3.141592653589793238462643383279502884197169399375105820974944592307816406286198")
ERROR: MethodError: no method matching parse(::var"#1#2", ::String)
Closest candidates are:
parse(::Type{T}, ::AbstractString; base) where T<:Integer at parse.jl:237
parse(::Type{T}, ::AbstractString; kwargs...) where T<:Real at parse.jl:376
parse(::Type{T}, ::AbstractString) where T<:Complex at parse.jl:378
...
Stacktrace:
[1] top-level scope at REPL[10]:1
这是为什么?因为如果它只是解析 Float64
并将其传递给 BigFloat
构造函数,那么“大”将是徒劳的——在数字达到 BigFloat
之前精度就会丢失。您需要从字符串直接转到内部表示。
我知道在 Julia 中我可以做 parse(BigFloat, x)
,其中 x
可能是一个字符串或 readline()
的结果。但是,如果我想在 parse
函数中为我的 BigFloat
指定精度怎么办?
如你所愿BigFloat(pi, precision = 50)
。
我相信这可以推广到您将函数、构造函数或类型放入另一个函数并且您想要指定前一个函数的参数的情况。
对于一般的构造函数和解析,没有解决方案,因为解析可能需要使用实现细节。但是由于 BigFloat
实现者已经预见到这个用例,构造函数有一个方法采用 AbstractString
和精度:
julia> BigFloat("3.141592653589793238462643383279502884197169399375105820974944592307816406286198")
3.141592653589793238462643383279502884197169399375105820974944592307816406286198
julia> BigFloat("3.141592653589793238462643383279502884197169399375105820974944592307816406286198", precision = 50)
3.1415926535897931
julia> parse(Float64, "3.141592653589793238462643383279502884197169399375105820974944592307816406286198")
3.141592653589793
你想象的概括也是不可能的;我认为你在那里有一个误解。 parse
的第一个参数 不是 被视为可调用对象,而是一种仅用于调度的类型。所以你不能通过传递一个匿名函数来绕过构造:
julia> parse(f -> BigFloat(f, precision=50), "3.141592653589793238462643383279502884197169399375105820974944592307816406286198")
ERROR: MethodError: no method matching parse(::var"#1#2", ::String)
Closest candidates are:
parse(::Type{T}, ::AbstractString; base) where T<:Integer at parse.jl:237
parse(::Type{T}, ::AbstractString; kwargs...) where T<:Real at parse.jl:376
parse(::Type{T}, ::AbstractString) where T<:Complex at parse.jl:378
...
Stacktrace:
[1] top-level scope at REPL[10]:1
这是为什么?因为如果它只是解析 Float64
并将其传递给 BigFloat
构造函数,那么“大”将是徒劳的——在数字达到 BigFloat
之前精度就会丢失。您需要从字符串直接转到内部表示。