haskell-jp / beginners #25 at 2024-07-31 16:30:11 +0900

困っている。ということではないのですが、質問させてください。

関数に引数が適用され、展開されていく様子を見られるようなツールのようなものは存在しますか ?
具体的には、以下のようなものがあったらと思っています。

[入力]
foldr (+) 0 [1..3]

[出力]
foldr ( (+) 1 0 ) 0 (2:3:[])
foldr ( (+) ((+) 1 0) 2 ) 0 (3:[])
foldr ( (+) ((+) ((+) 1 0) 2) 3 ) 0 ([])
foldr ( (+) ((+) 1 2) 3 ) 0 ([])
foldr ( (+) 3 3 ) 0 ([])

--> 6

私自身使ったことがないのでちゃんと動くか分かりませんがこれとかどうですか。
https://dennis.felsing.org/ghc-vis/
ちょっとオーバーキルかな?
いつもご回答いただきありがとうございます :man-bowing:

少し見てみましたが、オーバーキル。と言われた意味がわかりました :sweat_drops:

使いこなせるものか、もう少し調べてみます。
これがあるのを思い出しました!
https://well-typed.com/blog/2017/09/visualize-cbn/
また私自身試してないもので恐縮ですが、実際のところHaskellのサブセットのようですが、十分目的は達成できるはずです。
stack install visualize-cbn でインストールできてしまったので
試してみたところ、サブセットという意味がわかりました :sweat_drops:

fac = (\n ->
    if le n 1
      then 1
      else mul (@fac (sub n 1)) n
  )

main = @fac 1

これが

ubuntu@vm1:~/visualize-cbn$ ~/.local/bin/visualize-cbn -i examples/fac.hs --show-trace
** 0
fac = \n -> if n <= 1
              then 1
              else fac (n - 1) * n
fac 1

(apply fac)
...

** 3
fac = \n -> if n <= 1
              then 1
              else fac (n - 1) * n
1

(whnf)

こんな風に展開されていく様子が観察できました。
情報ありがとうございました :man-bowing: