回答編集履歴
5
本日の日付が間違っていたので直しました。
    
        answer	
    CHANGED
    
    | 
         @@ -51,7 +51,7 @@ 
     | 
|
| 
       51 
51 
     | 
    
         | 
| 
       52 
52 
     | 
    
         
             
            - Real World Haskell - [Chapter 23. GUI Programming with gtk2hs](http://book.realworldhaskell.org/read/gui-programming-with-gtk-hs.html)
         
     | 
| 
       53 
53 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
            ウェブでの日本語記事ですと、こちらを見つけました。この中の「Haskellでテトリス(Part 1〜9)」が丁寧に解説されていておすすめです。なお、GUI ツールキットは GTK を使っています。
         
     | 
| 
      
 54 
     | 
    
         
            +
            ウェブでの日本語記事ですと、こちらを見つけました。この中の「Haskellでテトリス(Part 1〜9)」が丁寧に解説されていておすすめです。なお、GUI ツールキットは GTK+ を使っています。
         
     | 
| 
       55 
55 
     | 
    
         | 
| 
       56 
56 
     | 
    
         
             
            - [muratamuu.github.io カテゴリー:Haskell](http://muratamuu.github.io/blog/categories/haskell/)
         
     | 
| 
       57 
57 
     | 
    
         | 
| 
         @@ -71,7 +71,7 @@ 
     | 
|
| 
       71 
71 
     | 
    
         | 
| 
       72 
72 
     | 
    
         
             
            最近では、OCaml や Haskell の他に、ML から大きな影響を受けている言語が増えてきました。[Scala](http://scala-lang.org/) もそのひとつで、日本語の情報も多いです。Scala なら Clojure と同様に、Java Swing を使ったデスクトップアプリが作れます。
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
            (2016年2月 
     | 
| 
      
 74 
     | 
    
         
            +
            (2016年2月6日追記)
         
     | 
| 
       75 
75 
     | 
    
         
             
            「Scala逆引きレシピ」(竹添直樹、島本多可子 著、翔泳社)に、数ページですが「GUIアプリケーションを作りたい」という項目があります。そこにはこのように書かれています。「もちろんScalaから直接Swingを使用することも可能ですが、scala.swingパッケージを使えば関数型言語らしい宣言的なスタイルで、SwingによるGUIアプリケーションを記述できます」
         
     | 
| 
       76 
76 
     | 
    
         
             
            (追記終わり)
         
     | 
| 
       77 
77 
     | 
    
         | 
4
Scala逆引きレシピ(書籍)の情報を追加しました
    
        answer	
    CHANGED
    
    | 
         @@ -69,8 +69,12 @@ 
     | 
|
| 
       69 
69 
     | 
    
         | 
| 
       70 
70 
     | 
    
         
             
            **その他:Scala**
         
     | 
| 
       71 
71 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
            最近では、OCaml や Haskell の他に、ML から大きな影響を受けている言語が増えてきました。[Scala](http://scala-lang.org/) もそのひとつで、日本語の情報も多いです。Scala なら Clojure と同様に、Java Swing を使ったデスクトップアプリが作れます。 
     | 
| 
      
 72 
     | 
    
         
            +
            最近では、OCaml や Haskell の他に、ML から大きな影響を受けている言語が増えてきました。[Scala](http://scala-lang.org/) もそのひとつで、日本語の情報も多いです。Scala なら Clojure と同様に、Java Swing を使ったデスクトップアプリが作れます。
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
      
 74 
     | 
    
         
            +
            (2016年2月26日追記)
         
     | 
| 
      
 75 
     | 
    
         
            +
            「Scala逆引きレシピ」(竹添直樹、島本多可子 著、翔泳社)に、数ページですが「GUIアプリケーションを作りたい」という項目があります。そこにはこのように書かれています。「もちろんScalaから直接Swingを使用することも可能ですが、scala.swingパッケージを使えば関数型言語らしい宣言的なスタイルで、SwingによるGUIアプリケーションを記述できます」
         
     | 
| 
      
 76 
     | 
    
         
            +
            (追記終わり)
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
       74 
78 
     | 
    
         
             
            **その他:Swift**
         
     | 
| 
       75 
79 
     | 
    
         | 
| 
       76 
80 
     | 
    
         
             
            Apple が開発し、オープソース化した Swift も、ML から多大な影響を受けています。iOS と(Mac)OS X 限定ですが、デスクトップアプリや iPhone のゲームを作るために生まれた言語です。iOS アプリの開発者は多いので、日本語の情報も多いです。
         
     | 
3
Swiftの項に文言を追加しました
    
        answer	
    CHANGED
    
    | 
         @@ -75,7 +75,7 @@ 
     | 
|
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
            Apple が開発し、オープソース化した Swift も、ML から多大な影響を受けています。iOS と(Mac)OS X 限定ですが、デスクトップアプリや iPhone のゲームを作るために生まれた言語です。iOS アプリの開発者は多いので、日本語の情報も多いです。
         
     | 
| 
       77 
77 
     | 
    
         | 
| 
       78 
     | 
    
         
            -
            日本の Haskell で Swift を使っている人は多いようで、ネット上では、Haskell の○○を Swift で再現してみる系の記事が多かったりします。
         
     | 
| 
      
 78 
     | 
    
         
            +
            日本の Haskell ユーザーで Swift を使っている人は多いようで、ネット上では、Haskell の○○を Swift で再現してみる系の記事が多かったりします。
         
     | 
| 
       79 
79 
     | 
    
         | 
| 
       80 
80 
     | 
    
         
             
            例:(デスクトップアプリの話ではありませんが)
         
     | 
| 
       81 
81 
     | 
    
         
             
            [Swiftでアプリカティブスタイル](http://qiita.com/koher/items/95583f58a443f6a33c28)
         
     | 
2
追加の質問に回答しました。
    
        answer	
    CHANGED
    
    | 
         @@ -32,4 +32,68 @@ 
     | 
|
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
            実は、Yesod のフレームワークのなかのどこかに `main` があって、そちらが最初に評価されるしくみになっているのです。このようなしくみなので、プロジェクトの雛形を作っただけで、ウェブサーバーを起動してデフォルトの画面を表示できるわけです。
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
            作りたいアプリと使いたい言語が決まったら、それに必要なライブラリやフレームワークがあるか調べてみてください。そして、それを試してみてください。試した上で、うまく行かないことがあれば、また質問すればいいのです。その時は、もっと具体的な質問になっているでしょう。
         
     | 
| 
      
 35 
     | 
    
         
            +
            作りたいアプリと使いたい言語が決まったら、それに必要なライブラリやフレームワークがあるか調べてみてください。そして、それを試してみてください。試した上で、うまく行かないことがあれば、また質問すればいいのです。その時は、もっと具体的な質問になっているでしょう。
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            ---
         
     | 
| 
      
 38 
     | 
    
         
            +
            (2016年1月30日 追加)
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            関数型言語に興味があって、それを使って、デスクトップアプリを作りたいのですね。
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            最初に言っておくと、私が仕事で主に使っているのは Erlang/OTP で、分散データベースの開発をしています。そのため、デスクトップアプリの開発についてはほとんどわかりません。Haskell や OCaml のような ML 系言語については、以前から趣味として学習しているというレベルです。Lisp も時々遊びで触る程度。最近は ML 系の Rust という言語を、Erlang と組み合わせて使おうとしています。(サーバー側での用途です)
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            なので、的確な回答ができるかはなんともいえないのですが、わかる範囲で書いてみます。
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            **Haskel**
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            たしかに、Haskell でデスクトップアプリを作っている人は、かなりの少数派のようです。ネットで検索してもあまり出てきませんね。手元には洋書中心で Haskell の書籍が5冊あります。が、その中で GUI について解説しているのは「Real World Haskell」ただ1冊で、しかも14ページしかありません。(英語版でのページ数です)
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            Real World Haskell の日本語翻訳版はオライリージャパンから出版されています。また、英語版ならオンラインで無料で読めます。
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            - Real World Haskell - [Chapter 23. GUI Programming with gtk2hs](http://book.realworldhaskell.org/read/gui-programming-with-gtk-hs.html)
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            ウェブでの日本語記事ですと、こちらを見つけました。この中の「Haskellでテトリス(Part 1〜9)」が丁寧に解説されていておすすめです。なお、GUI ツールキットは GTK を使っています。
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            - [muratamuu.github.io カテゴリー:Haskell](http://muratamuu.github.io/blog/categories/haskell/)
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            **Lisp**
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            Lisp に関しては、Common Lisp(CL)、Scheme(+Gauche)、Clojure といった方言がたくさんあり、さらに各方言について、処理系がいくつかある(CL なら SBCL、Clozure CL、CLisp など)という状況なので、非常に探しにくいです。
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            まあ、最近の日本語での情報(書籍やネット上の記事)の多さを取るなら、Java VM 上で動く [Clojure](http://clojure.org) がよいかと思います。Clojure なら、Java の GUI ツールキットである Swing を使ってデスクトップアプリも作れます。私は Clojure の書籍は持っていないので、ご自身で情報を探してみてください。
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            **その他:OCaml**
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            Haskell や Lisp 以外の関数型言語や、関数型言語の影響を強く受けた言語も紹介しましょう。
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
            まず、[OCaml](https://ocaml.org/) ですが、「プログラミング in OCaml」(五十嵐 淳 著、技術評論社)では、2章割いて GUI アプリ開発を解説しています(GUI ツールキットは Tk)。この本は、冊子版は絶版のようですが、[電子書籍版が買えます](http://www.fos.kuis.kyoto-u.ac.jp/~igarashi/OCaml/)。大学の講義を元に書かれたようで、関数型プログラミングの入門から GUI 構築までが丁寧に解説されていて、おすすめです。
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            **その他:Scala**
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
            最近では、OCaml や Haskell の他に、ML から大きな影響を受けている言語が増えてきました。[Scala](http://scala-lang.org/) もそのひとつで、日本語の情報も多いです。Scala なら Clojure と同様に、Java Swing を使ったデスクトップアプリが作れます。(書籍は過去数冊持ってましたが、みな処分してしまいました)
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            **その他:Swift**
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
            Apple が開発し、オープソース化した Swift も、ML から多大な影響を受けています。iOS と(Mac)OS X 限定ですが、デスクトップアプリや iPhone のゲームを作るために生まれた言語です。iOS アプリの開発者は多いので、日本語の情報も多いです。
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            日本の Haskell で Swift を使っている人は多いようで、ネット上では、Haskell の○○を Swift で再現してみる系の記事が多かったりします。
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            例:(デスクトップアプリの話ではありませんが)
         
     | 
| 
      
 81 
     | 
    
         
            +
            [Swiftでアプリカティブスタイル](http://qiita.com/koher/items/95583f58a443f6a33c28)
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
            **その他:Rust**
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
            [Rust](https://www.rust-lang.org/) も ML から多大な影響を受けています。Rust は、Mozilla が次期ウェブブラウザーの研究開発プロジェクトのために開発した言語で、マルチプラットフォーム(Windows、OS X、Linux)のデスクトップアプリやゲームなどを作るのに向いています。システムプログラミング向けの言語なので、OS を書くこともできます。ユーザーフォーラム(英語)の常連回答者たちを見ていると、Haskell ユーザーが多いように見えますね。
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
            Rust は私のイチオシ言語なのですが、ライブラリの成熟度がまだ低いことと、日本語の情報が少ないことがあり、デスクトップアプリの開発に使うには、まだ早いかもしれません。Piston という、マルチプラットフォームのゲームエンジンの開発が活発に行われていて、[Piston のホームページ](http://www.piston.rs/)では、簡単なパズルゲームや、Minecraft クローンなどのデモアプリが用意されています。また、もちろん、[開発途中のウェブブラウザー](https://servo.org/) もあります。
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
            **まとめ**
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
            いま紹介した中からですと、以下の順番で試すのがいいでしょうか?
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            0. Haskellでテトリス
         
     | 
| 
      
 94 
     | 
    
         
            +
            0. プログラミング in OCaml
         
     | 
| 
      
 95 
     | 
    
         
            +
            0. Clojure + Swing(情報はウェブや書籍で探してみる)
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
            このどれかの言語で、やりたいことができるようなら、とてもいいですね。
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            もし不十分だったら、さらに他の言語、Scala や (Mac)OS X なら Swift なども試してみてはどうでしょうか?
         
     | 
1
わかりやすさのために、数パラグラフ追加しました
    
        answer	
    CHANGED
    
    | 
         @@ -14,22 +14,22 @@ 
     | 
|
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
            どのようなプログラムでも、必ず入出力がありますので、どこかで必ず OS とやりとりをしています。でも、例えば、Yesod が、OS のシステムコールを直接呼び出しているかというと、そういうことはまずないでしょう。
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
            まず、どのプログラミング言語でも、入出力を行うための組み込みのしくみが付いています。例えば、Haskell で putStrLn とすれば、画面に文字列を表示できますし、hPutStr とすればファイルに文字列を格納できます。これらは、言語の「処理系」が、OS とやりとりをすることで実現しているわけです。
         
     | 
| 
      
 17 
     | 
    
         
            +
            まず、どのプログラミング言語でも、入出力を行うための組み込みのしくみが付いています。例えば、Haskell で `putStrLn` とすれば、画面に文字列を表示できますし、`hPutStr` とすればファイルに文字列を格納できます。これらは、言語(例:Haskell)の「処理系(例:GHC)」が、OS とやりとりをすることで実現しているわけです。
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
            さらに、すでにご存知だと思いますが、便利なプログラムをまとめた「ライブラリ」というものがあります。ライブラリには大きく分けて2つあって、その言語(例:Haskell)で書かれたものと、共有ライブラリという、別の言語(C言語とか C++とか、その他)で書かれたものがあります。
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
            共有ライブラリは、OS ごとにフォーマットが決まっていて、それさえ守ればどんな言語からも呼び出して使うことができます。例えば Haskell には FFI(外部関数インターフェイス)と呼ばれる仕組みがあって、これを通して、C言語などでかかれた共有ライブラリーを使うことができます。
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
            Yesod のようなフレームワークは、別の人たちが書いた、たくさんのライブラリを活用して構築されています。
         
     | 
| 
      
 23 
     | 
    
         
            +
            こういうライブラリの中には、HTTP プロトコルを扱うものだったり、SSL のような暗号化を扱うものだったり、データベースとのやり取りを扱うものだったり、いろいろなものがあります。Yesod のようなフレームワークは、処理系自体の機能に加え、こうした、別の人たちが書いた、たくさんのライブラリを活用して構築されています。
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
            デスクトップアプリを作るときには、普通は、OSの他に、ウィンドウやキーボードやマウスなどを扱うための、GUI ツールキットと呼ばれるライブラリを使います。(もちろん、FFI などを駆使すれば、それがなくても、ほとんど Haskell だけで作ることもできるでしょう。でも、さすがに何もないところから全部自分で作るのは大変すぎますよね) 例えば、Linux や BSD* などの Unixライクな OS だと、GTK+、Qt、wxWidgets という、X-Window というウインドウシステム上で動く GUI ツールキットがよく使われています。
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
            Haskell でも、すでにだれかが、これらのライブラリを Haskell から使うためのライブラリを用意しているはずです。ですから、そのなかから良さそうなものをいくつか選んで、実際に試してみて、「よし、これで行けそう」 
     | 
| 
      
 27 
     | 
    
         
            +
            Haskell でも、すでにだれかが、これらのライブラリを Haskell から使うためのライブラリを用意しているはずです。ですから、そのなかから良さそうなものをいくつか選んで、実際に試してみて、「よし、これで行けそう」というものが見つかったら、それを使って開発すればいいのです。
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
            なお、フレームワークもライブラリの一種 
     | 
| 
      
 29 
     | 
    
         
            +
            なお、フレームワークもライブラリの一種です。一般的に、ライブラリと呼ぶ時は、自分が書いたプログラムが主体になって、ライブラリにある部品(関数など)を呼び出す形で使います。
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
            フレームワークと呼ぶ時は、フレームワーク側のプログラムが主体になって、自分の書いたプログラムはフレームワークから呼んでもらいます。Haskell でプログラムを書くとき、`main` という名の `IO()` 型の変数を用意して、そこに IO アクションを束縛しますよね。でも、Yesod のようなフレームワークを使う時は、自分のプログラムでは、どこにも `main` などという変数は書きません。なのに動くわけです。
         
     | 
| 
      
 31 
     | 
    
         
            +
            フレームワークと呼ぶ時は、フレームワーク側のプログラムが主体になって、自分の書いたプログラムはフレームワークから呼んでもらいます。Haskell でプログラムを書くとき、`main` という名の `IO()` 型の変数を用意して、そこに IO アクションを返す関数を束縛しますよね。でも、Yesod のようなフレームワークを使う時は、自分のプログラムでは、どこにも `main` などという変数は書きません。なのに動くわけです。
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
            実は、Yesod のフレームワークのなかのどこかに `main` があって、そちらが最初に 
     | 
| 
      
 33 
     | 
    
         
            +
            実は、Yesod のフレームワークのなかのどこかに `main` があって、そちらが最初に評価されるしくみになっているのです。このようなしくみなので、プロジェクトの雛形を作っただけで、ウェブサーバーを起動してデフォルトの画面を表示できるわけです。
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
            作りたいアプリと使いたい言語が決まったら、それに必要なライブラリやフレームワークがあるか調べてみてください。そして、それを試してみてください。試 
     | 
| 
      
 35 
     | 
    
         
            +
            作りたいアプリと使いたい言語が決まったら、それに必要なライブラリやフレームワークがあるか調べてみてください。そして、それを試してみてください。試した上で、うまく行かないことがあれば、また質問すればいいのです。その時は、もっと具体的な質問になっているでしょう。
         
     |