And tagless final implementation is 9 times slower than the naive version, even though everything is typed and inlined:
tagless final of addition arithmetic evaluation:
julia> @code_typed evaluate_tf(sum_of_ints_tf(100))
CodeInfo(
1 ─ %1 = Core.getfield(term, :term1)::var"#4#5"{Int64}
│ %2 = Core.getfield(%1, :v)::Int64
│ %3 = Core.getfield(term, :term2)::var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64}
,var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{v
ar"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int
64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7
"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{
Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#
6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#
5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},va
r"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"
#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64}
,var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{v
ar"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int
64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7
"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{
...
var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#4#5"{Int64}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
│ %43 = Core.getfield(%42, :term1)::var"#4#5"{Int64}
│ %44 = Core.getfield(%43, :v)::Int64
│ %45 = Core.getfield(%42, :term2)::var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"
...
{Int64}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
│ %202 = Core.getfield(%201, :term1)::var"#4#5"{Int64}
│ %203 = Core.getfield(%202, :v)::Int64
│ %204 = Core.getfield(%201, :term2)::var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64}
,var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{v
ar"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int
64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7
"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{
Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#
6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#
5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#4#5"{Int64}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
│ %205 = Core.getfield(%204, :term1)::var"#4#5"{Int64}
│ %206 = Core.getfield(%205, :v)::Int64
│ %207 = Core.getfield(%204, :term2)::var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64}
,var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{v
ar"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int
64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7
...
,var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{v
ar"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int
64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7
"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{
Int64},var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#4#5"{Int64}}}}}}}}}}}}}}}}}}}}}}}}
│ %229 = Core.getfield(%228, :term1)::var"#4#5"{Int64}
...
{Int64},var"#6#7"{var"#4#5"{Int64}
,var"#4#5"{Int64}}}}
│ %289 = Core.getfield(%288, :term1)::var"#4#5"{Int64}
│ %290 = Core.getfield(%289, :v)::Int64
│ %291 = Core.getfield(%288, :term2)::var"#6#7"{var"#4#5"{Int64},var"#6#7"{var"#4#5"{Int64},var"#4#5"{Int64}}}
│ %292 = Core.getfield(%291, :term1)::var"#4#5"{Int64}
│ %293 = Core.getfield(%292, :v)::Int64
│ %294 = Core.getfield(%291, :term2)::var"#6#7"{var"#4#5"{Int64},var"#4#5"{Int64}}
│ %295 = Core.getfield(%294, :term1)::var"#4#5"{Int64}
│ %296 = Core.getfield(%295, :v)::Int64
│ %297 = Core.getfield(%294, :term2)::var"#4#5"{Int64}
│ %298 = Core.getfield(%297, :v)::Int64
│ %299 = Base.add_int(%296, %298)::Int64
│ %300 = Base.add_int(%293, %299)::Int64
│ %301 = Base.add_int(%290, %300)::Int64
│ %302 = Base.add_int(%287, %301)::Int64
│ %303 = Base.add_int(%284, %302)::Int64
...
│ %395 = Base.add_int(%8, %394)::Int64
│ %396 = Base.add_int(%5, %395)::Int64
│ %397 = Base.add_int(%2, %396)::Int64
└── return %397
) => Int64