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 之前精度就会丢失。您需要从字符串直接转到内部表示。