Skip to content

Commit 1fa0f30

Browse files
committed
WIP. SAMPLE CODE NOT TESTED AFTER UPDATING stack.yaml: Add strict-gotchas
1 parent ef3963a commit 1fa0f30

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

examples/2020/strict-gotchas/stack.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#
1818
# resolver: ./custom-snapshot.yaml
1919
# resolver: https://example.com/snapshots/2018-01-01.yaml
20-
resolver: lts-14.4
20+
resolver: lts-14.20
2121

2222
# User packages to be built.
2323
# Various formats can be used as shown in the example below.

preprocessed-site/posts/2020/strict-gotchas.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,73 @@ tags:
1010
---
1111

1212

13+
Haskellは他の多くのプログラミング言語と異なった特徴を持っており、しばしばそれらが議論を呼ぶことがあります。
14+
その中でも特によく俎上に上がるのが、遅延評価です。
15+
遅延評価は、適切に扱えば不要な計算を行わず、計算資源を節約してくれるステキな仕組みですが、一歩使い方を間違うと「サンク」という「これから実行する<small>(かも知れない)</small>計算」を表すオブジェクトが大量の作られてしまい、却ってメモリー消費量が増えてしまう、などといった問題を抱えています。
16+
この現象は「スペースリーク」と呼ばれ、かつて[専門のAdvent Calendar](https://qiita.com/advent-calendar/2015/haskell-space-leaks)が作られたことがあるほど、Haskeller達の関心を集めてきました。
17+
18+
そんなHaskeller達の悩みの種を軽減しようと、GHC 8.0以降、[`Strict`](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#strict-by-default-pattern-bindings)[`StrictData`](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#strict-by-default-pattern-bindings)という拡張が作られました。
19+
これらの拡張を大雑把に言うと、
20+
21+
- `StrictData`: 値コンストラクターにおいて、引数の値が弱頭正規形(Weak Head Normal Form。以降慣習に従い「WHNF」と呼びます)まで評価されるようになる
22+
- `Strict`: 値コンストラクターを含めたあらゆる関数やローカル変数の定義において、パターンマッチで束縛した変数の値がWHNFまで評価されるようになる
23+
24+
というものです。
25+
26+
このうち、`StrictData`は比較的リスクが少なく大変有用(もはや標準であって欲しいぐらい)という声をよく聞きますが[^strictdata-sample]`Strict`については様々な問題点があることが知られています。
27+
今回はその各種問題点をまとめて共有することで、思い切って`Strict`を有効にするときに参考になる情報を提供したいと思います!
28+
29+
[^strictdata-sample]: 例えばfumievalさんによる[この記事](http://fumieval.hatenablog.com/entry/2015/12/10/200630)
30+
31+
# 前提知識とその参考資料
32+
33+
以下の知識について、概要を理解しているものとして進めます。
34+
参考になりそうな日本語のページも付記したので、ご覧ください。
35+
36+
- Haskellの遅延評価について
37+
- [実装して理解する遅延評価の仕組み 〜 thunkを絵に描いて理解しよう・JavaScriptでHaskellを実装!? - プログラムモグモグ](https://itchyny.hatenablog.com/entry/20130209/1360417348)が分かりやすいでしょう
38+
- Haskellの正格評価について
39+
- [正格性のすべて (翻訳)](https://haskell.e-bigmoon.com/posts/2018/06-25-all-about-strictness)
40+
- `Strict``StrictData`について
41+
- [Strict Haskell - あどけない話](https://kazu-yamamoto.hatenablog.jp/entry/20151117/1447726679)
42+
- その他、[Haskellスペースリーク Advent Calendar 2015 - Qiita](https://qiita.com/advent-calendar/2015/haskell-space-leaks)の記事にも有用なものがたくさんあります。
43+
44+
# サンプルコードの試し方
45+
46+
これから紹介するコードは、すべて[このブログのリポジトリーの、`examples`ディレクトリー](https://github.com/haskell-jp/blog/tree/master/examples/2020/strict-gotchas)に置いておきました。
47+
下記のコマンドを実行すれば実際に試すことができます。
48+
49+
```
50+
git clone https://github.com/haskell-jp/blog.git
51+
cd blog/examples/2020/strict-gotchas
52+
stack exec runghc -- <これから紹介するコードのファイル>.hs
53+
```
54+
55+
実際に試すときは`-XStrict`というオプションを`runghc`に付けた場合と付けなかった場合両方で実行して、違いを確かめてみてください。
56+
57+
なお、使用したGHCのバージョンは8.6.5で、OSはWindows 10 ver. 1909です。
58+
59+
# Case hoge: `where`句だろうとなんだろうと評価
60+
61+
hoge
62+
63+
# Case hoge: ポイントフリースタイルかどうかで変わる!
64+
65+
hoge
66+
67+
# Case hoge: 内側のパターンはやっぱりダメ
68+
69+
hoge
70+
71+
## [strict-types](https://github.com/pepeiborra/strict-types)が使えるかも
72+
73+
hoge
74+
75+
# Case hoge: `foldl``foldr`
76+
77+
hoge
78+
79+
# Case hoge: `undefined`を受け取るメソッド
80+
81+
hoge
82+

0 commit comments

Comments
 (0)