2016-08-29 10 views
0

のは、私はこのように単純に実現される機能を持っているとしましょう:複数の同一の部分式があり一般的な部分式消去がGHCで起こっているかどうかを知るには?

quadratic a b c = (ans1, ans2) 
    where 
    ans1 = ((-b) + sqrt (b * b - 4 * a * c))/(2 * a) 
    ans2 = ((-b) - sqrt (b * b - 4 * a * c))/(2 * a) 

。どのようにして共通の部分式消去が起こっているかどうか、そしてこれのどの部分にコアを読まずに伝えることができますか?

+0

「読書コアで」と答えています。なぜそれをしたくないのですか? 'Debug.Trace'から関数を挿入することで推測できるかもしれませんが、私はそれに頼ることはありません。 – jberryman

+0

@jberrymanどのようなコードが最適化される可能性が高いかどうかを示す経験則がありますか? – rityzmon

+0

無関係ですが、非決定性はタプルではなくリストでモデル化されています。 '二次式a b c = [ans 1、ans 2] where ...' – chepner

答えて

3

traceを使用すると、this SO questionに示すように表示される場合があります。

-O2または -O3ショートレース出力で ans1ans2の両方でこれをコンパイルする
import Debug.Trace 

quadratic a b c = (ans1, ans2) 
    where 
    ans1 = ((-b) + tr1 (sqrt (b * b - 4 * a * c)))/(2 * a) 
    ans2 = ((-b) - tr2 (sqrt (b * b - 4 * a * c)))/(2 * a) 
    tr1 = trace "ans1" 
    tr2 = trace "ans2" 

main = print $ quadratic 1 10 3 

GHCはCSEを行わなかったことを示しています。両方の場所でtr1を使用すると、類似した の結果が得られます。

ハスケルのWikiはGHCは限られ 状況でCSEを実行することを言及 - (link) - あなたは、あなたはそれが起こることを確認したい場合は、それを自分で を実行することをお勧めしています。

関連する問題