# throws error
split("123456789", "") .|> x -> parse(Int8,x) |> x -> reshape(x, 3, 3)
# works as expected
A = split("123456789", "") .|> x -> parse(Int8,x)
reshape(A, 3, 3)
Hey guys Can someone explain me why piping does not work in the first case?
Can you share the error you get? I suspect that putting parentheses around the two first terms will help clarify what you mean.
Compare:
reshape(parse(string))
vs
reshape(parse)(string)
which will rightfully complain that reshaping the parse
function doesn’t make sense.
(Also a function not working unexpectedly is normally only a problem if the function is rand
)
1 Like
julia> split("123456789", "") .|> x -> parse(Int8,x) |> x -> reshape(x, 3, 3)
ERROR: MethodError: no method matching reshape(::Int8, ::Int64, ::Int64)
Closest candidates are:
reshape(::AbstractArray, ::Int64...) at C:\Users\Dorian\.julia\juliaup\julia-1.7.2+0~x64\share\julia\base\reshapedarray.jl:116
reshape(::AbstractArray, ::Union{Int64, AbstractUnitRange}...) at C:\Users\Dorian\.julia\juliaup\julia-1.7.2+0~x64\share\julia\base\reshapedarray.jl:110
reshape(::AbstractArray, ::Union{Colon, Int64}...) at C:\Users\Dorian\.julia\juliaup\julia-1.7.2+0~x64\share\julia\base\reshapedarray.jl:117
Stacktrace:
[1] (::var"#106#108")(x::Int8)
@ Main c:\Users\Dorian\Projects\Sudoku.jl\main.jl:18
[2] |>(x::Int8, f::var"#106#108")
@ Base .\operators.jl:966
[3] (::var"#105#107")(x::SubString{String})
@ Main c:\Users\Dorian\Projects\Sudoku.jl\main.jl:18
[4] |>(x::SubString{String}, f::var"#105#107")
@ Base .\operators.jl:966
[5] _broadcast_getindex_evalf
@ .\broadcast.jl:670 [inlined]
[6] _broadcast_getindex
@ .\broadcast.jl:643 [inlined]
[7] getindex
@ .\broadcast.jl:597 [inlined]
[8] copy
@ .\broadcast.jl:899 [inlined]
[9] materialize(bc::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(|>), Tuple{Vector{SubString{String}}, Base.RefValue{var"#105#107"}}})
@ Base.Broadcast .\broadcast.jl:860
[10] top-level scope
@ c:\Users\Dorian\Projects\Sudoku.jl\main.jl:18
Guess your suspicion was correct, the code below works. I usually put brackets around my closures, but this was one case where I really did not expect it to matter! I still don’t really get why Julia tries to reshape parse
# works
split("123456789", "") .|> (x -> parse(Int8,x)) |> (x -> reshape(x, 3, 3))
(Edit: I tried to minimally edit my title to reflect my not so great use of unexpectedly. [Nice catch btw])
Ok, it’s subtly different from what I thought but still. It tries to reshape each of the parsed Int8
s into 3x3 matrices:
split(str, "") .|> x -> ( parse(Int8, x) |> y -> +(y, 3, 3) )
Now replace +
by reshape
.
Basically the only way the parser could know this is not what you mean is for it to know what reshape
does.
1 Like
Thanks, your example is quiet clear. I always thought implicitly everything between two pipes takes precedence, but I can see how this is not always desirable!