let x = 1 + 2 :: Int
:sprint x
x = _
lotz
April 12, 2020
これは『Haskellによる並列・並行プログラミング』リモート輪講 #1で学んだことのメモです。
:sprint
は変数の評価を”行わずに”その内容を表示する機能。これを使えばサンクのまま詰まれていてまだ評価されていない部分も確認することができる
↑アンダースコアはサンクを表しておりxがまだ評価されていないことが分かる
↑x
が評価されたので中身も見えるようになった
次は変数が変数を参照している例
↑seq
を使うと第一引数が弱頭部正規形(最初の構成子が見えるところ)まで強制的に評価される
あれ?これはへいへいHaskellでは z = (_, _)
と見えるはずなんだけど違う結果になってしまった。
↑今度はうまくタプルの構成子が見えるところまで評価された
↑x
だけ評価すると3
が見えるようになった。z
が評価されていないのでx + 1
の部分はサンク_
のままである
今度はリストと map
を使ったときの挙動を見てみる
↑:
はリストの構成子なのでここが弱頭部正規形
↑length
は中身を評価しないので構造だけが評価されて中はサンクのまま
↑これで全部評価された
:sprint
を使うとHaskellの遅延評価で何がどこまで評価されるのかインタラクティブに分かるので面白い。