Created
March 27, 2013 12:14
-
-
Save ikedaisuke/5253746 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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