WxHaskell
Upcoming SlideShare
Loading in...5
×
 

WxHaskell

on

  • 4,060 views

How to make GUI in Haskell

How to make GUI in Haskell

Statistics

Views

Total Views
4,060
Views on SlideShare
4,005
Embed Views
55

Actions

Likes
0
Downloads
14
Comments
0

3 Embeds 55

http://d.hatena.ne.jp 48
http://www.slideshare.net 6
http://www.slideee.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

WxHaskell WxHaskell Presentation Transcript

  • λ WxHaskell λλ inajob http://d.hatena.ne.jp/inajob/
  • λ wxWidgets λλ ● クロスプラットホームなGUIツールキット – 単にGUIのセットだけではなく通信や文字列操作、ファイル 管理も行うことが出来る欲張りなライブラリ – C++で記述されているが様々な言語から利用可能 ● wxPython,wxPerl,WxHaskell... ● 類似品 – Gtk – Tk – Qt – Swing
  • λ Haskell λλ ● 純関数型言語 – 正直なところ何が出来るのかとか僕は理解していない – Haskellを理解するためにGUIアプリケーションを作ってみる ● WxHaskell – HaskellからwxWidgetsを操作するためのラッパライブラリ – これでHaskellを使ってGUIアプリケーションが作れる main = putStrLn “Hello world” main = putStrLn $ show 2008 main = putStrLn (show 2008)
  • λ 日本語 λλ ● ソースコードにutf8を使うと日本語を表示できる – ソースコード中の文字を自動でUCS4に変換する ● 読み込んだデータを表示する – そのままだと文字化けする – hogehoge⇒UCS4 変換を利用する (hogehoge:読み込んだデータの文字コード)
  • λ 初めてのWindow λλ import Graphics.UI.WX main = start mainFrame mainFrame = do f <- frameFixed [text := quot;はろー Worldquot;] p <- panel f [] set f [layout := minsize (sz 300 300) $ widget p] ● いきなりdo – GUIを扱う命令はIOなので仕方がないです ● := でプロパティを設定可能
  • λ 初めてのWindow2 λλ import Graphics.UI.WX main = start mainFrame mainFrame = do s <- readFile “title.txt” f <- frameFixed [text := utf8ToUcs4 s] p <- panel f [] set f [layout := minsize (sz 300 300) $ widget p] ● 外部データをGUIに表示する時は変換関数を通す
  • λ はじめてのレイアウト λλ mainFrame = do f <- frame [text := quot;titlequot;] p <- panel f [] b <- button p [text := quot;pushquot;] i <- textEntry p[text := quot;aquot;] set p [layout := (row 2 [fill$widget i,widget b])] set f [layout := (fill $ widget p)] ● button,textEntry ● widget,row,column,fill,等でレイアウトを整える – リサイズに耐える設計 ● 親をちゃんと指定しましょう
  • λ もっとレイアウト λλ mainFrame = do f <- frame [text := quot;titlequot;] p <- panel f [] b <- button p [text := quot;pushquot;] i <- textEntry p[text := quot;aquot;] l <- singleListBox p [items := [quot;inaquot;,quot;jobquot;,quot;kpcquot;]]; set p [layout :=(column 2 [ (row 2 [fill$widget i,widget b]), fill$widget l ])] set f [layout := (fill $ widget p)] ● singleListBox
  • λ イベント λλ mainFrame = do f <- frame [text := quot;titlequot;] p <- panel f [] b <- button p [text := quot;pushquot;,on command ::= buttonEv] i <- textEntry p [text := quot;aquot;] set p [layout := (row 2 [fill$widget i,widget b])] set f [layout := (fill $ widget p)] buttonEv w = showDialog quot;helloquot; quot;worldquot; w showDialog:: String -> String -> Window a -> IO () showDialog msg title parent = do mesd <- messageDialogCreate parent msg title wxOK messageDialogShowModal mesd messageDialogDelete mesd ● クリックされると関数が呼び出される
  • λ マルチスレッドとチャンネル λλ mainFrame = do eventsChan <- newChan --MultiThread Queue f <- frame [text := quot;titlequot;] p <- panel f [] i <- textEntry p [text := quot;aquot;] b <- button p [text:=quot;pushquot;,on command::=buttonEv i eventsChan] set p [layout := (row 2 [fill$widget i,widget b])] set f [layout := (fill $ widget p)] timer <- windowTimerCreate f timerOnCommand timer (onTimer eventsChan i) timerStart timer 500 False onTimer chan i = do noEvents <- isEmptyChan chan if noEvents then return () else do str <- readChan chan; set i [text := show$str] buttonEv i chan w= do forkOS child set i [text:= quot;startquot;] where child = writeChan chan $fact 1000000 fact n=foldl' (*) 1 [1..n] ● 別スレッドからの信号をタイマーで受け取る – (重い計算をするとどっち道固まったorz)
  • λ Twitterクライアントを書いてみた λλ ● 一応かけた ● 良かったこと – JSONのパーサをいじるのが楽だった – 必要かどうか不明な通信を遅延評価で隠蔽 (unsafePerformIOの利用) ● 悪かったこと – GUI周りはとても手続き的 – 通信も手続き的 – コンパイルである程度バグが取れるが、それ以降のデバッ グがやりにくい ● http://d.hatena.ne.jp/inajob/20081005
  • λ まとめ λλ ● GUIは手続き型言語に任せて ● パーサやアルゴリズムのコアの部分をHaskellで記述 するのがよさそう