私は次の関数を書きました..そしてWinHugsを使って実行しました
teneven = [x | x <- [1..10], even x]
私の出力:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
とにかく、すべてのリダクションを出力する方法はありますか..それで、WinHugs 内で行われているコア評価を知ることができますか?
私は次の関数を書きました..そしてWinHugsを使って実行しました
teneven = [x | x <- [1..10], even x]
私の出力:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
とにかく、すべてのリダクションを出力する方法はありますか..それで、WinHugs 内で行われているコア評価を知ることができますか?
いくつかのアイデア:
debug コマンドライン オプション (Hugs で設定できます:set +d
) は情報を提供しますが、非常に冗長で、Haskell 構文の縮小は表示されません。
Hat - Haskell Tracer を試してみてください。簡単なプログラムで試してみたところ、かなりクールです。ただし、私は Windows を使用していません。実行するのがどれほど難しいかはわかりません。それはクールで本質的にあなたが望むものなので、それは残念です. 実行すると、Hat から次のような情報を取得できます。
main = {IO}
teneven = [2,4,6,8,10]
_foldr (\..) [1,2,3,4,5,6,7,8, ...] [] = [2,4,6,8,10]
(\..) 1 [2,4,6,8,10] = [2,4,6,8,10]
(\..) 2 [4,6,8,10] = [2,4,6,8,10]
(\..) 3 [4,6,8,10] = [4,6,8,10]
(\..) 4 [6,8,10] = [4,6,8,10]
(\..) 5 [6,8,10] = [6,8,10]
(\..) 6 [8,10] = [6,8,10]
(\..) 7 [8,10] = [8,10]
(\..) 8 [10] = [8,10]
(\..) 9 [10] = [10]
(\..) 10 [] = [10]
そこのラムダはeven
. また、必要に応じて、Hat は の呼び出しfoldr
やその他の内部呼び出しを追跡できます。デフォルトでは、そうしません。
ここでは、Debug.Trace と Hugs.Observe の使用例をいくつか示します。
import Debug.Trace
fact :: Integer -> Integer
fact 0 = trace "fact 0 ->> 1" 1
fact n = trace ("fact " ++ show n) (n * fact (n-1))
import Hugs.Observe
fact :: Integer -> Integer
fact 0 = observe "fact 0" 1
fact n = observe "fact n" (n * fact (n-1))
これが、WinHungs を使用してすべてのリダクションを出力する方法を理解するのに役立つことを願っています。
私を信じてください、あなたはこの道を行きたくないのです。
それぞれの特定のケースで使用されるリダクションのセット (および順序) は、特定の言語の実装に依存します (hugs は、ある方法で、ghci - 別の方法で、jhc - さらに別の方法で、など)。
関数型言語用のコンパイラ/インタープリター/仮想マシンを実装する一般的な方法について何かを読んだほうがよい-SECDマシンなど.
いくつかのリンク: