はてなキーワード: Haskellとは
コロナ自粛で勉強中。以前買ったHaskell本を読み直している。落ち着いて読めば結構理解できる。
https://gihyo.jp/book/2016/978-4-7741-8390-9
現場の方々に向け,関数プログラミングのエッセンスを厳選解説した入門書。
関数型言語Haskellを用い,基本から,Java 8/C/C++/Python/JavaScript/Rubyをはじめ各種命令型言語との比較,オススメの開発/設計テクニック等を平易に解説。
改訂版ではGlasgow Haskell Compiler 8ならびに新機構のStackage/stackへの全面対応,関数型言語由来の他言語の機能解説章(第8章)の新設(Swift/Go/Rust/C#等の例も紹介)をはじめ実践開発に役立つ解説を増強し,関数型言語でも命令型言語でも活かせる「使える基本」を凝縮しました。
消えているのでここまでしか読めないけど、期待してます。タグを見張ってるのでデビューなさったら気づくと思う。cabal 関連でわからないことがあったら、オレは Haskell できるけど Anond には基本張り付いないので、コミュニティに相談するといいよ。Slack の haskell-jp の questions スレッドがいちばん人が多くて、やたら親切に教えてくれる。
ところでちょっと聞いてください。こないだ自室の iPad の動画アプリ VLC でエロ動画を観てたんです。ふと気になって、アプリの右上にある"RSSのアイコンにウインドウを重ねたようなアイコン"を押してみた。すると画面が真っ暗になり、突然、居間の大画面のテレビからエロ動画が流れ始めた😱
これが Chromecast と呼ばれる機能です。テレビのBRAVIAにはこの機能が内蔵されているとのこと。同じLANに繋いだPCから音楽や映像をワンタップで送ることができる。怖るべきことにこれはテレビのスリープも解除するらしい。アラートもなく設定でオフにできないので、これを働かなくさせるにはテレビの Chromecast 機能を無効化するか、同じLANに繋がないしかない。必死に調べて、対策を取りました(居間は普段親が寝る部屋なので、たまたま昼間で、誰もいなくて、本当に良かった)。
この Chromecast を使ってスライドを表示できるのでは? と思って調べてました。
Chromecast の機材は4000円以下で買える。戦略はこうです。これをプロジェクターに繋ぎ、会議室に小規模の無線LANを構築します。発表者はスマホでそこに接続してもらい、Google スライドアプリにいれた発表資料を Chromecast する。スマホは誰でも持っているし、これなら追加の費用も少なめで得体の知れないUSBを刺される怖れもなく安全に、トラブルも少ない発表環境が作れるかも。
このプログラミング言語はMtGだと多分この色の組み合わせだろう。
みたいなのをまとめたら次のようになった(TIOBEのランキング順トップ50)。
後半は知らない言語もあって怪しいが、おおよそこのようになると思われる。
※改めて見てみると何箇所か違和感があったので最初の版からちょっとだけ修正した。
順位 | プログラミング言語 | 色の組み合わせ | 内訳 |
---|---|---|---|
1 | Java | アブザン | 白黒緑 |
2 | C | ゴルガリ | 黒緑 |
3 | Python | ティムール | 緑青赤 |
4 | C++ | ジャンド | 黒赤緑 |
5 | C# | バント | 緑白青 |
6 | Visual Basic .NET | セレズニア | 緑白 |
7 | JavaScript | ボロス | 赤白 |
8 | PHP | グルール | 赤緑 |
9 | SQL | 無色 | |
10 | Swift | 4C(緑欠色) | 白青黒赤 |
11 | Go | ゴルガリ | 黒緑 |
12 | Assembly language | 黒単 | 黒 |
13 | R | イゼット | 青赤 |
14 | D | グリクシス | 青黒赤 |
15 | Ruby | 赤単 | 赤 |
16 | MATLAB | イゼット | 青赤 |
17 | PL/SQL | 無色 | |
18 | Delphi/Object Pascal | アゾリウス | 白青 |
19 | Perl | ラクドス | 黒赤 |
20 | Objective-C | エスパー | 白青黒 |
21 | SAS | アゾリウス | 白青 |
22 | Visual Basic | 緑単 | 緑 |
23 | Dart | ジェスカイ | 青赤白 |
24 | Scratch | 白単 | 白 |
25 | Scala | 5C | 白青黒赤緑 |
26 | Groovy | ナヤ | 赤緑白 |
27 | Transact-SQL | 無色 | |
28 | F# | アゾリウス | 白青 |
29 | Rust | マルドゥ | 赤白黒 |
30 | COBOL | オルゾフ | 白黒 |
31 | ABAP | アゾリウス | 白青 |
32 | Lisp | シミック | 緑青 |
33 | Kotlin | 4C(緑欠色) | 白青黒赤 |
34 | Logo | 白単 | 白 |
35 | RPG | ディミーア | 青黒 |
36 | Lua | 緑単 | 緑 |
37 | Fortran | スゥルタイ | 黒緑青 |
38 | PowerShell | ジェスカイ | 青赤白 |
39 | Ada | ディミーア | 青黒 |
40 | LabVIEW | ディミーア | 青黒 |
41 | Erlang | 緑単 | 緑 |
42 | Julia | イゼット | 青赤 |
43 | ML | 青単 | 青 |
44 | Scheme | シミック | 緑青 |
45 | Haskell | エスパー | 白青黒 |
46 | TypeScript | ジェスカイ | 青赤白 |
47 | OpenEdge ABL | アゾリウス | 白青 |
48 | LiveCode | アゾリウス | 白青 |
49 | PostScript | 無色 | |
50 | ActionScript | ジェスカイ | 青赤白 |
見返してみるとおおよそ次のルールに従って決めているような気がした。
緑の判定があやふやな気が若干しないでもない…
色 | イメージ |
---|---|
白 | 高レイヤ、初心者向け |
青 | 浮世離れ、ベンダー |
黒 | 低レイヤ、黒魔術 |
赤 | 速い、先進的 |
緑 | 基盤、グルー |
無色 | 道具 |
C言語:
Linuxとかサーバープログラムの内部で使われることが多いけど、
C++:
実行速度が超高速なのと複雑怪奇な構文が特徴だよ!
ゲームプログラミングや動画編集ソフトといった高いパフォーマンスが
求められるシステムで使われるイメージがあるから、最初は近づかなくても良さそうだね!
C#:
Microsoft にズブズブな印象が強いのがちょっと気になっちゃうね!
Java:
Androidアプリとかサーバーアプリ作るのに使えるよ!
最初は近づかないほうが懸命だと思うよ!
Javaの強化版で、Androidアプリとかサーバーアプリ作るのに使うよ!
もしAndroidアプリを作るなら最初にこれを学ぶと良いかも???
iosアプリを作るのに使えるよ!
iosアプリ作ってる時にどうしても触らなきゃいけないときが来るんだよね...。
iosアプリを作るのに使うよ!
もしもiosアプリ作りたいんだったら実質これしか選択肢は無いから覚悟してね?
書きやすい方だから身構えなくても大丈夫だけど、Macが無いと書けないから気をつけて!
PHP:
PHPのお仕事はいっぱいあるからこれが出来ると飯が食えて嬉しいね!
Ruby:
個人的には本当に好きじゃないけど、仕事も人口も多いのが特徴だね!
JavaScript:
環境を整えたり流行を追ったりするのがちょっとだけ面倒くさいけど、
Go:
Googleで開発された言語で、書いてるとドーパミンが出るよ!
僕が大好きな言語なんだけど残念ながら仕事は少ないね、本当に残念だ。
Lua:
ほとんど見かけないのに何故かたまに書かざるを得ない事がある言語だよ!
既存のアプリケーションのプラグインを書く時に強制されたりするかな?
言語自体は単純だから、使う時が来たら覚えるぐらいでいいと思うよ!
Perl:
遥か昔に広く利用されていた言語だよ!
きっと今でもどこかの世界では使われてるんだろうけど、
令和だったら他の言語も学びやすい環境が整ってるから学ばなくて良いかもね!
私もそうだ。
原因を考えてみると、書いている内に自分で反論を思いついてしまうからというのがある。
反論される前に先回りして細かい条件を文章中に書こうとしてしまう。
私はプログラミングを趣味にしている。
モダンなプログラミング言語はやりたいことをやれるというだけではなく「制約」を記述できるようになっている場合がある。
C++ ならコンセプト (が導入される予定)、 Rust ならトレイト、 Haskell なら型クラス。
自分がやろうとしていることの前提は何か、それを合理的に整理するのが癖になっている。
どうでもよい文章を書くにあたっても必要以上に但し書きを付けてしまう。
ま、別にそれが悪いことだとは思ってないけどね。
開発言語は基本的にPHPとJavascriptの職場。
別に複雑なコードでもないし、PHPやJSでも、まがりなりにもコードを書いてる人なら見ればわかるでしょって感じなんだけど。
スマホアプリ作るときも、JSならだれでもメンテナンスできるからってmonacaとかいうJSでアプリが開発できるやつを採用したけど、Webとはアーキテクチャが違いすぎるから結局一部の人間にしか触れなくて、そんなマイナーなプラットフォーム採用した意味なかったし。
ちょっとしたツールを作るときも、Windowsアプリとして作ったほうが使い勝手いいから、VB.NETかC#で作ろうって話になってもベテラン勢が猛反対して、無理やりPHPでWebアプリとして作ることになったし。
サーバーで使うシェルスクリプト(.sh)も未経験の俺が、ネットでチョコチョコとググって改修して、すごいびっくりされたことがあるけど、こっちからすればなんであんたらは触れないかっていう感じだし。(黒魔術的な書き方もあるらしいけどもちろんそんな書き方ではない)
Windowsサーバーで使う .BAT ファイルを書くときに、.BATファイルの仕様では黒魔術的なテクニックを使わないと実現できない仕様だったからほかの言語にしませんかって提案したけど、.BATでないとほかの人が保守できないからと却下。
無理に.BATで書いて、逆に変なテクニックを駆使した保守性皆無のコードになってたし。
どの言語を使うかって話題になると、自分の使ってる言語以外を使うとアイデンティティが崩壊するかのような勢いで反対する。
Haskellみたいにまったく思想の違う言語ならともかく、似たような言語で、かつifとループと配列とサブルーチンの概念を把握していたら理解できるような書き方しかしてないコードでも、普段使ってない言語って時点で理解不能に陥るんだよな。
一応あらかじめ釘を指しておくと、有名で実用的な言語に限った比較の話である
「LL言語は楽勝」というのが一般的な見解だと思うけど、よくよく考えてみたらRubyほど学習コストの高い言語も珍しいと思う
言語を(使うものとして)理解するには、「コアコンセプトを理解する」「構文を覚える」「組み込み/標準ライブラリに何が有るかを覚える」という要素があるように感じている(これは感じているだけなので事実ではないかもしれない)
Rubyはプログラマがプログラミング的なことについて楽をするための言語である(と思う)
たとえば素数判定ひとつするにしても、自力で高速な素数判定を実装するよりも、 require 'prime' して Integer#is_prime? するのが正しいという雰囲気がある
というよりも、自力で一生懸命実装することが悪であるかのような雰囲気さえある
「こう書けば短い/楽なのに、どうしてそう書かないの?」という雰囲気が漂っている
Rubyで時間計算量やメモリ効率の話をするのはナンセンスなので、純粋に書き方のみを取り上げて優劣を語ることができる
そうなってくると、『ちゃんとRubyが書ける』という状態になるには「組み込み/標準ライブラリに何が有るかを覚える」というステップが非常に大事になってくる
これが莫大なコストになっている。
「コアコンセプトを理解する」コストはHaskellやRustではやや大きいかもしれないが理解するのはそう難しくない「Haskell入門して1ヶ月経つけどHaskellの何が特徴的なのかまったくわからん」などという人はいない
そう考えるとRubyは「組み込み/標準ライブラリに何が有るかを覚える」が非常に大事だし莫大な量である
Rubyに入門して数年経つけど、いまだに「えっこんなメソッドあったの」というのが時々ある
辛い
このエントリは中からも外からも匿名な感じでお送りしております。中の人を当てられたら1000ガバス。
子供の頃とかはダイヤブロック好きでした。延々ぐちゃぐちゃロボットとか作ってた気がする。
高校まではプログラムとか全然。ゲームやっててあーこういうゲーム自分でも作ってみてーなーみたいな。
大学は行きました。でも情報系じゃなくていわゆる理工系の学部のどっかなぜなら情報系は偏差値が高かったから。大学在学中にサークルとか趣味でプログラミング的なことを始めてあーやっぱこういうの楽しいよなーと思った。製品出てくるまでのライフタイムがほぼゼロで即結果が帰ってくるようなの。ほいでサークルでゲームとか部内サービスとかいろいろ作りました。学んだのはDirectXとかCPPとかHakellとかdotNetとか。あ、プログラミング系のバイトもやってました。覚えてない。CとかSQLとかいじってた気がする。
院にも行きました。ここで本格的に情報系の職業に付きたいのでやっぱ箔は必要かなと思って情報系の院へ。特に後に仕事で直接役に立つ研究はしてなかった気がしますが、とにかく論建ての厳密性みたいなのはサンドバッグになりながら学べた気がします。英語は終始できませんでした。読んだ論文は英語だったけど結局日本語でしか書いてない。
さて就職活動ですが、Googleが応募してるらしいので応募しました。なんかこーあんまり低級なことはしてこなかったのでCとかわざわざ書いて練習した気はします。Haskellよりも100倍早かった。
面接の内容は言えませんけど(新卒でも中途でも同じ基準らしいっすよ)強いて言うなら「XXX(任意の基礎知識)?なんすかそれ?」(面接官に教えてもらう)「それはこういうことでっしゃろか?たぶんこー書いたら実装できます?」みたいな受け答えがウケたんじゃないかなーと思う。自分知識はボロカスですけど知恵には自信あります。
まぁこうしばらく中で過ごしてみて思うのは、のたうち回る能力がまず必要で、次にしんどい時にカードをさっと挙げれる能力とかかなーと。困らないようにする能力と困った時になんとかする能力。結局どうしたって困るので。
やることは超クソ複雑な制約のもとでナイスなシステムを組み上げることで、結局クソ複雑な実装になります。さらにその上で最適化したり既存の機能を壊さないように新機能実装したり。
最近TOEIC受けてないけど900取れた覚えはない。ただTOEIC高得点の人の英語Youtubeで聞いてもアレな感じなことがあるのでTOEICが西海岸の荒野で通じるかは知りません。
技術力がすごい人?そりゃいるんじゃないんですか?ただ僕は圧倒的に人を見る目がないのでなんかみんなすごいって言ってる人はすごいんだろーなーみたいな雑な。でも子供の頃じーちゃんちで泣かされた黒猫より怖い人にはまだあったことがありません。
実を言うと、普通のプログラマはオブジェクト指向以前のプログラミングも理解できないんだけど、あれらはまだ手続き的な要素を内在してるから、そっちだけを受け取ることはできる。
それまで手続き的な要素+宣言的な要素だったプログラミングが、関数型プログラミングへと移行する時に手続き的な要素を切り捨てたのね。より純粋な手法に進化するために。
だから、それまで手続き部分だけを受け取って喜んでた普通のプログラマは急にわからなくなりヒステリーを起こした。
だけど、プログラミング上級者はオブジェクト指向以前にも宣言的な部分しか見てないから普通のプログラマが何を騒いでるのかわからない。
普通のプログラマって、部品化の凄いやつが関数型プログラミングになるとか勘違いしがちだけど(staticおじさんもその変奏)、全く質の違うもの。
部品化って、重複コードをひすたらサブルーチンに括り出すようなもの。副作用がある。
日本のSIer(日立NEC富士通とか)って教養がない極東の田舎者だから、副作用を理解できない。すぐに「部品化」を持ち上げる。怖いんだろう。自分に理解できないプログラミングが。モナドですら大多数は理解できないんだもの。あんな教科書的なものですら。
とにかくアジアってIT後進国なのね。トップの日本ですらこうなのだから。"NTT"データがHaskellでレガシーシステムを脈絡なく解析してホルホルしてるレベルだもの。
まず日本に生まれた時点で、関数型プログラミングを理解するには圧倒的に不利。こんなこと言うと、「普通のプログラマにもわかやすく説明できるのが一流ダー」みたいな恥ずかしい駄々っ子が沸いてくるけど、プログラミングって歴史上一度も大衆を相手にしてないので。
OSSの恩恵で、普通のプログラマもコンパイラを無料で使えるようにになっただけで泣いて喜ぶべき。
そしてあれは、将来のスポンサーとコミッタの入り口としてやってるの。1000人に1人、将来コミュニティに貢献する人材がいるかもしれないと信じて。
シリコンバレー住人にもOSSコミッタにもなれない普通のプログラマはまあ、おこぼれで"文化的"コスプレしてQiitaでもやればいいんだと思うよ。
今は全然関係ないことに従事していて、それが大して面白くもないのだが。
たまにはラズベリーパイを弄ったり組版ソフトで面白いものを見つけて弄っている。
そんな私が何年か前に30日でできるOS本とDIrectX9入門の本を買って触っていた。昔話だ。
Cを最初にやるときののヘッダーファイル、あるいはwindowsプログラミングでウィンドウを表示するときの様な「おまじない」だ。
ロクな説明もされないまま、写経しているうちにコードが増えて行き、なんかサンプルに毛が生えた様なものができて満足するが釈然としない。
分かった気がしない。
OpenGL/GLUTを後年マニュアルを参照しながら一生懸命やったときの方が理解できた気がしたし、オリジナリティのあるコードとなった。
やはりこういう根幹部分の知識は悪戦苦闘しなければ、身につけないのだろうかと少し思う。
昨今大量に溢れるラッパーやフックを見て様々な機能が便利になったと感心する。
プログラマとして働いたことはないが、車輪の再発明は学習以外においては悪だと学んできたので、それは大変結構だと思う。
ライブラリの再利用は良い。だが、その便利さがかえって学習者の成長を妨げるのではないか。