Skip to content

Instantly share code, notes, and snippets.

@ikedaisuke
Created March 27, 2013 12:14
Show Gist options
  • Save ikedaisuke/5253746 to your computer and use it in GitHub Desktop.
Save ikedaisuke/5253746 to your computer and use it in GitHub Desktop.
2013-03-27 すごいHaskell読書会 in 大阪 #7 の課題について
@yashigani さんの出題した課題の設計方針を書きます
問題はこちら:
https://gist.github.com/yashigani/5231928
上記資料の一番下に課題があります。
転載:
-----
# 課題
Twitterやchatをしている際,「突然の○○」でオチをつけたくなることありませんか?
<s>無い人は今すぐ病院に行くことをオススメします.</s>
「突然の○○」を表示する,`sudden`コマンドを作ってください.
## Usage
``` sh
> sudden do
_人人人人人人_
> 突然のdo <
 ̄Y^Y^Y^Y^Y ̄
```
-----
これから Haskell と ghc でこの問題を解くプログラムの設計方針をたてます。
sudden はコマンドプロンプトを受け取り、第一引数の文字列を「突然のアスキーアートに埋め込んだ」文字列を標準出力に出力します。
第一引数が空だった場合の言及はないので未定義とします。
(親切に usage を表示するというのがひとつの方針)
問題を分割統治します。
1. モジュール System.Environment にある getArgs :: IO [String] で引数を受け取る
2. 第一引数の文字列を「アスキーアートを描画する」関数にわたす。この関数の実装方針はあとで述べる。この関数は pure で、文字列を返す。 draw :: String -> String とする。
3. 得られた文字列を標準出力する。putStrLn :: String -> IO () を使う
draw :: String -> String は分割統治して実装する。 Haskell のプログラミングの一手法として、「データと処理の二つを引数にとり、そのデータをその処理に渡してできあがる結果を返す」実装がある。たとえば、withFile や mapM など。
データとはなにか。データはアスキーアートの部品である。例えば:
underscore :: String
underscore = "_"
hito :: String
hito = "人"
などである。
データの次に考えるのは処理をどう書くかである。「文字列を横や縦に並べる」「文字列を真ん中におく」などの処理は pretty print と呼ばれる。Haskell では、 John Hughes の論文(*1)に基づくライブラリ Text.Pretty がある。このライブラリは難しいものではない(論文は簡単ではないかもしれないけれども)。
文字列を真ん中におく処理は表組みを行うためのパッケージ boxes があるのでそれを用いてもよい。
http://www.tedreed.info/programming/2012/06/02/how-to-use-textprettyprintboxes/
(*1)
John Hughes, "The design of a pretty-printing library"
Advanced Functional Programming
Lecture Notes in Computer Science Volume 925, 1995, pp 53-96
http://www.cs.chalmers.se/~rjmh/Papers/pretty.ps
まだ解決していない方針は、文字幅のずれである。また、 boxes を使ったプログラム経験がないので、もしかしたら不適切な提示だったかもしれない。
1. 四隅に四隅の文字を置く
2. 上の罫線にあたる人を並べる
3. 下の^Yも 2. と同様なので、抽象化されて両方おなじ処理
4. センタリングする
と、ここまで書いて、皆さんの解答を聞いて、pretty print は今回の課題には over weight で、単に文字列の結合 (++) だけで実現できるのでは?というひどいオチ。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment