1
捕獲変数に依存する関数は、閉鎖型の安定
function function_maker(N)
if N == 1
x = 1.0
else
x = 1
end
f(y) = x+y
end
のために、私はタイプ-安定しないと、この出力をしたいが、私はそれが型安定であるf
を生成したい作りますすなわちN
の値によって決定されるx
のタイプを使用して、N
に依存する関数を生成する。基本的には、これから出てくる機能を演奏したいと思っていますが、function_maker
自体は演奏する必要はありません。なぜなら、それはグローバルな範囲または機能の障壁の上でしか使われないからです。
f = function_maker(1)
@code_warntype f(1)
Variables:
#self#::#f#9
y::Int64
Body:
begin
return ((Core.getfield)((Core.getfield)(#self#::#f#9, :x)::ANY, :contents)::ANY + y::Int64)::ANY
end::ANY
これはデフォルトでは発生しません。私はf(y) = x::typeof(x)+y
を試しましたが、それもうまくいきませんでした。これを行う簡単な方法はありますか?
面白いです!変数(xとxx)を変更しても助けにならない:function function_maker3(N)N == 1 && begin x = 1. return y - > x + y end || begin xx = 1; return y - > xx + y end end'である。しかし、最初のもの(!) 'begin'だけを' let'と置き換えると動作します。そして、2番目のものだけを置き換えることはできません。 – Liso
本当にクールな答え!これは間違いなく私が心に留めなければならないトリックです。 –
@Lisoあなたが言うことは面白いです。 2つの変数名関数が型安定した 'f'を返すようにするには、条件付き前に' local x :: Float64、xx :: Int64'を追加する必要がありました。おそらくコンパイラは型の不確実性を持っていません未処理の条件付きパス内のローカル変数第1と第2の間の 'let'の非対称性については、' function_maker(1) 'と' function_maker(2) 'の両方で' f'の安定性をテストしましたか?おそらく 'let'ブランチは安定していて、もう一方のブランチは安定していません。 –