Haskellですべての縮小を印刷することは可能ですか?WinHugsを使用して?
-
03-07-2019 - |
質問
次の関数を記述しました..WinHugsを使用して実行しました
teneven = [x | x <- [1..10], even x]
私の出力:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
とにかくすべての削減を印刷するためにそこにあります。
解決
いくつかのアイデア:
-
debugコマンドラインオプション(Hugsの
:set + d
で設定可能)は有益ですが、非常に冗長であり、Haskell構文の削減を示しません。 -
ハット-Haskellトレーサーを試してください。単純なプログラムで試してみましたが、かなりクールです。しかし、私は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はfolder
の呼び出しやその他の内部呼び出しを追跡できます。デフォルトでは、それはしません。
他のヒント
ここには、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を使用してすべての削減を印刷する方法を理解するのに役立ちます。
信じてください、あなたはこの道を行きたくありません。
特定の各ケースで使用されるリダクションのセット(および順序)は、特定の言語実装に依存します(ハグはある方法で、ghci-別の方法で、jhc-さらに別の方法で、など)。
SECDマシンなど、関数型言語用のコンパイラ/インタープリター/仮想マシンを実装する一般的な方法についての詳細を読んでください
複数のリンク:
- ウィキペディア、 SECDマシン
- Lambda the Ultimate、 高速インタープリターの実装
所属していません StackOverflow