回答編集履歴
5
本日の日付が間違っていたので直しました。
test
CHANGED
@@ -104,7 +104,7 @@
|
|
104
104
|
|
105
105
|
|
106
106
|
|
107
|
-
ウェブでの日本語記事ですと、こちらを見つけました。この中の「Haskellでテトリス(Part 1〜9)」が丁寧に解説されていておすすめです。なお、GUI ツールキットは GTK を使っています。
|
107
|
+
ウェブでの日本語記事ですと、こちらを見つけました。この中の「Haskellでテトリス(Part 1〜9)」が丁寧に解説されていておすすめです。なお、GUI ツールキットは GTK+ を使っています。
|
108
108
|
|
109
109
|
|
110
110
|
|
@@ -144,7 +144,7 @@
|
|
144
144
|
|
145
145
|
|
146
146
|
|
147
|
-
(2016年2月
|
147
|
+
(2016年2月6日追記)
|
148
148
|
|
149
149
|
「Scala逆引きレシピ」(竹添直樹、島本多可子 著、翔泳社)に、数ページですが「GUIアプリケーションを作りたい」という項目があります。そこにはこのように書かれています。「もちろんScalaから直接Swingを使用することも可能ですが、scala.swingパッケージを使えば関数型言語らしい宣言的なスタイルで、SwingによるGUIアプリケーションを記述できます」
|
150
150
|
|
4
Scala逆引きレシピ(書籍)の情報を追加しました
test
CHANGED
@@ -140,7 +140,15 @@
|
|
140
140
|
|
141
141
|
|
142
142
|
|
143
|
-
最近では、OCaml や Haskell の他に、ML から大きな影響を受けている言語が増えてきました。[Scala](http://scala-lang.org/) もそのひとつで、日本語の情報も多いです。Scala なら Clojure と同様に、Java Swing を使ったデスクトップアプリが作れます。
|
143
|
+
最近では、OCaml や Haskell の他に、ML から大きな影響を受けている言語が増えてきました。[Scala](http://scala-lang.org/) もそのひとつで、日本語の情報も多いです。Scala なら Clojure と同様に、Java Swing を使ったデスクトップアプリが作れます。
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
(2016年2月26日追記)
|
148
|
+
|
149
|
+
「Scala逆引きレシピ」(竹添直樹、島本多可子 著、翔泳社)に、数ページですが「GUIアプリケーションを作りたい」という項目があります。そこにはこのように書かれています。「もちろんScalaから直接Swingを使用することも可能ですが、scala.swingパッケージを使えば関数型言語らしい宣言的なスタイルで、SwingによるGUIアプリケーションを記述できます」
|
150
|
+
|
151
|
+
(追記終わり)
|
144
152
|
|
145
153
|
|
146
154
|
|
3
Swiftの項に文言を追加しました
test
CHANGED
@@ -152,7 +152,7 @@
|
|
152
152
|
|
153
153
|
|
154
154
|
|
155
|
-
日本の Haskell で Swift を使っている人は多いようで、ネット上では、Haskell の○○を Swift で再現してみる系の記事が多かったりします。
|
155
|
+
日本の Haskell ユーザーで Swift を使っている人は多いようで、ネット上では、Haskell の○○を Swift で再現してみる系の記事が多かったりします。
|
156
156
|
|
157
157
|
|
158
158
|
|
2
追加の質問に回答しました。
test
CHANGED
@@ -67,3 +67,133 @@
|
|
67
67
|
|
68
68
|
|
69
69
|
作りたいアプリと使いたい言語が決まったら、それに必要なライブラリやフレームワークがあるか調べてみてください。そして、それを試してみてください。試した上で、うまく行かないことがあれば、また質問すればいいのです。その時は、もっと具体的な質問になっているでしょう。
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
---
|
74
|
+
|
75
|
+
(2016年1月30日 追加)
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
関数型言語に興味があって、それを使って、デスクトップアプリを作りたいのですね。
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
最初に言っておくと、私が仕事で主に使っているのは Erlang/OTP で、分散データベースの開発をしています。そのため、デスクトップアプリの開発についてはほとんどわかりません。Haskell や OCaml のような ML 系言語については、以前から趣味として学習しているというレベルです。Lisp も時々遊びで触る程度。最近は ML 系の Rust という言語を、Erlang と組み合わせて使おうとしています。(サーバー側での用途です)
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
なので、的確な回答ができるかはなんともいえないのですが、わかる範囲で書いてみます。
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
**Haskel**
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
たしかに、Haskell でデスクトップアプリを作っている人は、かなりの少数派のようです。ネットで検索してもあまり出てきませんね。手元には洋書中心で Haskell の書籍が5冊あります。が、その中で GUI について解説しているのは「Real World Haskell」ただ1冊で、しかも14ページしかありません。(英語版でのページ数です)
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
Real World Haskell の日本語翻訳版はオライリージャパンから出版されています。また、英語版ならオンラインで無料で読めます。
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
- Real World Haskell - [Chapter 23. GUI Programming with gtk2hs](http://book.realworldhaskell.org/read/gui-programming-with-gtk-hs.html)
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
ウェブでの日本語記事ですと、こちらを見つけました。この中の「Haskellでテトリス(Part 1〜9)」が丁寧に解説されていておすすめです。なお、GUI ツールキットは GTK を使っています。
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
- [muratamuu.github.io カテゴリー:Haskell](http://muratamuu.github.io/blog/categories/haskell/)
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
**Lisp**
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
Lisp に関しては、Common Lisp(CL)、Scheme(+Gauche)、Clojure といった方言がたくさんあり、さらに各方言について、処理系がいくつかある(CL なら SBCL、Clozure CL、CLisp など)という状況なので、非常に探しにくいです。
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
まあ、最近の日本語での情報(書籍やネット上の記事)の多さを取るなら、Java VM 上で動く [Clojure](http://clojure.org) がよいかと思います。Clojure なら、Java の GUI ツールキットである Swing を使ってデスクトップアプリも作れます。私は Clojure の書籍は持っていないので、ご自身で情報を探してみてください。
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
**その他:OCaml**
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
Haskell や Lisp 以外の関数型言語や、関数型言語の影響を強く受けた言語も紹介しましょう。
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
まず、[OCaml](https://ocaml.org/) ですが、「プログラミング in OCaml」(五十嵐 淳 著、技術評論社)では、2章割いて GUI アプリ開発を解説しています(GUI ツールキットは Tk)。この本は、冊子版は絶版のようですが、[電子書籍版が買えます](http://www.fos.kuis.kyoto-u.ac.jp/~igarashi/OCaml/)。大学の講義を元に書かれたようで、関数型プログラミングの入門から GUI 構築までが丁寧に解説されていて、おすすめです。
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
**その他:Scala**
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
最近では、OCaml や Haskell の他に、ML から大きな影響を受けている言語が増えてきました。[Scala](http://scala-lang.org/) もそのひとつで、日本語の情報も多いです。Scala なら Clojure と同様に、Java Swing を使ったデスクトップアプリが作れます。(書籍は過去数冊持ってましたが、みな処分してしまいました)
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
**その他:Swift**
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
Apple が開発し、オープソース化した Swift も、ML から多大な影響を受けています。iOS と(Mac)OS X 限定ですが、デスクトップアプリや iPhone のゲームを作るために生まれた言語です。iOS アプリの開発者は多いので、日本語の情報も多いです。
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
日本の Haskell で Swift を使っている人は多いようで、ネット上では、Haskell の○○を Swift で再現してみる系の記事が多かったりします。
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
例:(デスクトップアプリの話ではありませんが)
|
160
|
+
|
161
|
+
[Swiftでアプリカティブスタイル](http://qiita.com/koher/items/95583f58a443f6a33c28)
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
**その他:Rust**
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
[Rust](https://www.rust-lang.org/) も ML から多大な影響を受けています。Rust は、Mozilla が次期ウェブブラウザーの研究開発プロジェクトのために開発した言語で、マルチプラットフォーム(Windows、OS X、Linux)のデスクトップアプリやゲームなどを作るのに向いています。システムプログラミング向けの言語なので、OS を書くこともできます。ユーザーフォーラム(英語)の常連回答者たちを見ていると、Haskell ユーザーが多いように見えますね。
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
Rust は私のイチオシ言語なのですが、ライブラリの成熟度がまだ低いことと、日本語の情報が少ないことがあり、デスクトップアプリの開発に使うには、まだ早いかもしれません。Piston という、マルチプラットフォームのゲームエンジンの開発が活発に行われていて、[Piston のホームページ](http://www.piston.rs/)では、簡単なパズルゲームや、Minecraft クローンなどのデモアプリが用意されています。また、もちろん、[開発途中のウェブブラウザー](https://servo.org/) もあります。
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
**まとめ**
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
いま紹介した中からですと、以下の順番で試すのがいいでしょうか?
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
0. Haskellでテトリス
|
186
|
+
|
187
|
+
0. プログラミング in OCaml
|
188
|
+
|
189
|
+
0. Clojure + Swing(情報はウェブや書籍で探してみる)
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
このどれかの言語で、やりたいことができるようなら、とてもいいですね。
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
もし不十分だったら、さらに他の言語、Scala や (Mac)OS X なら Swift なども試してみてはどうでしょうか?
|
198
|
+
|
199
|
+
|
1
わかりやすさのために、数パラグラフ追加しました
test
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
-
まず、どのプログラミング言語でも、入出力を行うための組み込みのしくみが付いています。例えば、Haskell で putStrLn とすれば、画面に文字列を表示できますし、hPutStr とすればファイルに文字列を格納できます。これらは、言語の「処理系」が、OS とやりとりをすることで実現しているわけです。
|
33
|
+
まず、どのプログラミング言語でも、入出力を行うための組み込みのしくみが付いています。例えば、Haskell で `putStrLn` とすれば、画面に文字列を表示できますし、`hPutStr` とすればファイルに文字列を格納できます。これらは、言語(例:Haskell)の「処理系(例:GHC)」が、OS とやりとりをすることで実現しているわけです。
|
34
34
|
|
35
35
|
|
36
36
|
|
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
Yesod のようなフレームワークは、別の人たちが書いた、たくさんのライブラリを活用して構築されています。
|
45
|
+
こういうライブラリの中には、HTTP プロトコルを扱うものだったり、SSL のような暗号化を扱うものだったり、データベースとのやり取りを扱うものだったり、いろいろなものがあります。Yesod のようなフレームワークは、処理系自体の機能に加え、こうした、別の人たちが書いた、たくさんのライブラリを活用して構築されています。
|
46
46
|
|
47
47
|
|
48
48
|
|
@@ -50,20 +50,20 @@
|
|
50
50
|
|
51
51
|
|
52
52
|
|
53
|
-
Haskell でも、すでにだれかが、これらのライブラリを Haskell から使うためのライブラリを用意しているはずです。ですから、そのなかから良さそうなものをいくつか選んで、実際に試してみて、「よし、これで行けそう」
|
53
|
+
Haskell でも、すでにだれかが、これらのライブラリを Haskell から使うためのライブラリを用意しているはずです。ですから、そのなかから良さそうなものをいくつか選んで、実際に試してみて、「よし、これで行けそう」というものが見つかったら、それを使って開発すればいいのです。
|
54
54
|
|
55
55
|
|
56
56
|
|
57
|
-
なお、フレームワークもライブラリの一種
|
57
|
+
なお、フレームワークもライブラリの一種です。一般的に、ライブラリと呼ぶ時は、自分が書いたプログラムが主体になって、ライブラリにある部品(関数など)を呼び出す形で使います。
|
58
58
|
|
59
59
|
|
60
60
|
|
61
|
-
フレームワークと呼ぶ時は、フレームワーク側のプログラムが主体になって、自分の書いたプログラムはフレームワークから呼んでもらいます。Haskell でプログラムを書くとき、`main` という名の `IO()` 型の変数を用意して、そこに IO アクションを束縛しますよね。でも、Yesod のようなフレームワークを使う時は、自分のプログラムでは、どこにも `main` などという変数は書きません。なのに動くわけです。
|
61
|
+
フレームワークと呼ぶ時は、フレームワーク側のプログラムが主体になって、自分の書いたプログラムはフレームワークから呼んでもらいます。Haskell でプログラムを書くとき、`main` という名の `IO()` 型の変数を用意して、そこに IO アクションを返す関数を束縛しますよね。でも、Yesod のようなフレームワークを使う時は、自分のプログラムでは、どこにも `main` などという変数は書きません。なのに動くわけです。
|
62
62
|
|
63
63
|
|
64
64
|
|
65
|
-
実は、Yesod のフレームワークのなかのどこかに `main` があって、そちらが最初に
|
65
|
+
実は、Yesod のフレームワークのなかのどこかに `main` があって、そちらが最初に評価されるしくみになっているのです。このようなしくみなので、プロジェクトの雛形を作っただけで、ウェブサーバーを起動してデフォルトの画面を表示できるわけです。
|
66
66
|
|
67
67
|
|
68
68
|
|
69
|
-
作りたいアプリと使いたい言語が決まったら、それに必要なライブラリやフレームワークがあるか調べてみてください。そして、それを試してみてください。試
|
69
|
+
作りたいアプリと使いたい言語が決まったら、それに必要なライブラリやフレームワークがあるか調べてみてください。そして、それを試してみてください。試した上で、うまく行かないことがあれば、また質問すればいいのです。その時は、もっと具体的な質問になっているでしょう。
|