Haskellに惑わされ – 3

今回サーチして見つけたのがこのサイトでした なかなか簡潔に Haskellのイロハが記載されて助かりました このサイトではまったのが次のプログラム

letTest1 x = let a = 3
                 f v = v + 2
             in do a * f x

これを例えば letTest1.hsとしてファイル・セーブするのです そしてghciを立ち上げて compileすれば、letTest1という関数が認識されるので、ここで例えば

*Main>letTest1 2

と打ち込めば、この場合には 12という計算結果が戻ります しかし最初はこれがどうして 12になるのか全く分かりませんでした そもそも let文の中にある f v = v + 2 という式はどう解釈するのか? という問題です 色々と考えた結果、fは内部関数名、vは内部引数名であることに気づきました

従って、letTest1 2という命令を出せば、その定義で、2という実引数は xという引数に相当するので、最後の文である in do a * f xという文の中の xが 2に置換され、fという内部関数が実行されます その結果、内部的に f  = 2 + 2となりf という関数の戻り値は 4となります そして aは 3なので letTest1の結果は、3 * 4で 12となります

ここまで自分で自分に説明してようやく理解できました

Haskellに惑わされ – 2

最近相当に頭がバカになっている そんな気がするのです タイピング速度も低下し、頭の回転も遅い、そんな自分に嫌になります 何が原因か? うーん 歳かなあ いやいやそんなことではない 自分が怠惰になっているからなのだ そこで、こういう時の一番の気付け薬である Haskell programmingに戻りました うーんずいぶんと遠ざかっていましたね だって難しいんだもの こんな言語ってないよ 本当に 普通のプログラミング言語とは全く違うのです

僕だって色々な言語をこれまでいじってきたのでだいたい少しかじれば少なくとも Hello World!ぐらいは画面に出せるし、あるいは 1から 100までの足し算だってすぐにその言語でプログラム書けるようになりますよっ

でも、Haskellは別 全く分からない どうすればいいのか全く分からない まず最初の関門がその実行環境です

僕が現在「これが一番いい」と思っている環境は VisualStudio Codeをインストールして、その中で terminal (Bashなど)を立ち上げることです そうすると Haskell programを VS codeの中で書いて、そこで VS code内の terminalより実行できます

まず今回はまったのは 本に書いてあったサンプル・プログラムである 1から nまでの合計を求める関数です(再帰版)

$ghci

これによりHaskell正当のコンパイラ/インタプリタである Glasgow Haskell Compiler/Interpreterが立ち上がります そうすると僕の場合以下のようなプロンプトが terminalに出力され、Haskellのコマンド待ち、となります

GHCi, version 8.6.3: http://www.haskell.org/ghc/  :? for help
Prelude>

この環境はいわゆるREPL ( Read-Eval-Print Loop)というものなので、この Prelude>のコマンド待ち部分に入力することにより Haskellを実行できます ここでまずこの REPL ( Read-Eval-Print Loop)を用いて 本にあるようにプログラムを打ち込みます そうすると驚愕の結果となり、瞬時に勉強心を打ち砕かれます それは

Prelude> mysum 0 = 0
Prelude> mysum n = n + mysum (n - 1)
Prelude> 
Prelude> mysum 0
*** Exception: stack overflow
Prelude>

というような結果です 要するに本の通り打ち込んでも stack overflowという無限ループに陥りクラッシュするのです とんでもない とんでもない

僕は真剣に本に対してクレームをしようかと思いましたよっ しかししかし これをファイルとしてセーブするのです 試みにこのファイルを mysum.hs というものにしますね はい$lsすればセーブされたことがわかりますね

$ls -l
-rw-r--r--   1 transradial  staff       64  7 17 09:51 mysum.hs

そして再び Haskell を立ち上げます

$ghci

そうするとHaskellの REPLに入り

Prelude>

という待受になります ここで 次の GHCIコマンドによりさっきセーブしたファイルを読み込みます

Prelude>:l mysum.hs

このようにするとファイルが読み込まれ、コンパイルされて以下のように応答してきます

[1 of 1] Compiling Main             ( mysum.hs, interpreted )
Ok, one module loaded.
*Main>

今度は *Main> という待受になり、自分の書いたプログラムが正常に作動する状態になっているのです ここで

*Main>mysum 0
0

となりますね、つまり 0 (Zero)を引数として mysum関数を呼び出したところ、結果が 0である、と出力されたのですね では同様にして 100を引数として呼び出せばどうなるでしょうか?

*Main> mysum 100
5050

はいきちんと 1から100までの合計値 5050が出力されました

要するに、REPL環境で打ち込んでもダメなのです これが分かるのに相当に時間を浪費しました しかしその副作用で頭脳回転が早くなりましたね

本日よりJTVT開催です

残念ながら外は結構激しい雨です まあものは考えようですが、これであれば湘南に来られる観光客は少なく、その結果、江ノ電もそんなに混まないでしょう

というのも、本日より僕が会長をする JTVT 2019という日本国内最大の心臓弁を中心とした心疾患に対するカテーテルを用いた治療法に関する学会がこの鎌倉プリンスホテルでいよいよ午後 14:00より開催されるのです そこで1番の問題は観光客が殺到し、江ノ電による公共交通が遮断されることでした でもこの雨であれば、その心配は無用でしょう

昨夜 Martin Leon先生も羽田空港経由でホテルに到着されました 全世界の心血管インターベンション界の至宝であられるLeon先生が無事到着され、それだけでも安堵し、満足です

まあ、あとは学会が成功するか否か、それは天命のみぞ知る、そんな気分です この学会が終了すれば、すぐに次の準備に移らねばなりません

そんな中、何回目かの挫折していた Haskellに再びアタックです やはりどうしても Monadという概念を心から理解したいのです あと Haskellとは関係ありませんが、 Tensorという概念も心から理解したいですね どなたか手取り足取り教えていただければ何とかなると思うのですが、独習では困難です

またまた Haskellに迷わされ

さて本日は順調にTAVIが進んでいます 僕自身も 1st operatorとして EvolutProを用いて一例あっという間に治療終了しました 完璧なできでした

さて、その間に頭脳の一部、というか手技の合間に Haskell programmingを考えています 相変わらずとても難しい あの例の、「すごいHaskellたのしく学ぼう!」という有名な書籍で始めた勉強も途中 20%程度進んだところで暗礁に乗り上げてしまいました 何が何だかさっぱり理解できない

そこで今度はこの有名な入門書から、日本人が書いた本「Haskell入門 – 関数型プログラミング言語の基礎と実践」に切り替えたのです

もちろん最初から読み始めたのですが、そうすると前の本で勉強した部分も再び読むので何となく理解が進みます でもやはり暗礁に乗り上げたのです 現在、

$ghci

あるいは

$stack ghci

というコマンドで GHC interpreterを走らせてテストしているのです どうしてもうまく行かない!!

Prelude>:{
Prelude>|f x = case x of n | n `mod` 2 == 0 -> putStrLn "even"
Prelude>|                 | otherwise -> putStlLn "odd"
Prelude>|:}

これで compile errorが出るのです!! ちなみにそのエラー内容は

:40:3: error: parse error on input ‘|’

というものです まさかまさかと思ってやってみました 今度はこのように入力したのです

Prelude> :{
Prelude| f x = case x of n | n `mod` 2 == 0 -> putStrLn "even"
Prelude|                   | otherwise -> putStrLn "odd"
Prelude| :}

そうすると何とエラーが出ずに

Prelude>f 10
even
Prelude>f 9
odd

となり作動しました 要するに”|”という縦棒までの文字数が上下で同じでないとエラーになるのでした 何でもこの縦棒のことを”ガード”と呼ぶらしいです これで論理構造を表すのですね 何だか Pythonのインデントのようです でもここに辿り着くのに30分かかりました 何しろ Kindle本ではこの部分縦棒が揃っていないのですから・・・

まったく駄目な自分

もう嫌になってしまう 貫徹するのが苦手な自分に嫌になってしまう 明らかに若い頃と比べると何かに一心に向かって進む強い気持力が低下している すぐにあっち あるいは こっちと目移りしてしまう

もちろん、医師としての自分の、いやこれで医師なのだろうか? 今どこかの現場、あるいは疫病が蔓延する地域に放り込まれた時、あるいはそこまでではなくて通常の日常診療に放り込まれた時、そんな時自分は医師として何らかの善を成し得るのだろうか? 既に医師 –> 内科医 –> 循環器内科医 –> インターベンション専門医 –> 経カテーテル的大動脈弁植え込み術・経皮的僧帽弁接合不全修復システム (MitraClip)・慢性完全閉塞・経橈骨動脈的冠動脈インターベンション専門医 としてどんどん分化し、専門バカになっている自分に汎用的な場面で何か医師としてできるものがあるのだろうか? いや翻って考えれば、そんな風に脱分化して行くことが、本当に正しいのだろうか?

そんなことを考えてしまう 何故そのようなことに至ったか? 数週間前、純粋関数型言語 Haskellに踏み込み、分からないながらもテストプログラムで練習繰り返していた自分がいました しかし、その後 Angularに目移りし、テスト練習プログラムを勉強し、Kindle本も何冊も途中まで読んでいた自分がいました

それが今朝 6:30AM 出勤途中、いつもPodCastで医学のこと、プログラミングのこと、素粒子のこと、相対性理論のこと、それらを耳学問で聞きながら歩いて 30 – 40分 その間それなりに勉強しながら出勤するのですが、AMP (Accelerated Mobile Pages)に心を動かされたのです でも新たな勉強が必要だし、ましてや自分にそんな能力あるのか否か? まったく自信がありません そもそも自分は何をしたいのだろうか? 一昨日も馬鹿なことしました

一昨日札幌から羽田に夜到着し、仕事の打ち合わせで大森蒲田の昭和の雰囲気が色濃く残る横丁の寿司屋さんに入りました カウンターのみ 6名しか入れない寿司屋さんです 若い大将は寿司に命を賭けている そんな雰囲気がありありです そこでおいしい寿司を食べ、日本酒を飲みました 隣にはご主人がスウェーデン出身、奥様は日本人の蒲田在住10数年のご夫婦が座っておられました その後何となく意気投合したのです。

スウェーデンと言えば三菱重工業に相当する世界的大企業 SAABで有名ですが、この歴史的な王国は独自の文化に色づいています

スウェーデン王国王宮の衛兵交代式

そうPCIの分野では SCAAR Registry
(Swedish Coronary Angiography and Angioplasty Registry)

が有名ですよね もうかれこれ10年ぐらい前(正確には2007/11/25 – /28)に自分でストックホルムの大学病院で治療した慢性完全閉塞患者さん二例がこの SCAR registryに登録されましたね

ストックホルムでの慢性完全閉塞治療
講義をしています
立派に手技していますね
十分に討論しながらの手技教育

さて、もう一つ有名なことはもちろんノーベル賞ですよね でも、それよりも僕にとっては心に残っているのが、有名な小説より起こしたシリーズ映画である「ドラゴン・タトゥーの女」シリーズなのです この映画の独特の「ああスウェーデンという国はこのようなところなんだな」と思わせる雰囲気あるいは文化、すごく印象深い映画です。そして偶然なことに今週ダラスからロスに乗り継ぎで帰国する途中の American Airlineでこの映画の四作目である「蜘蛛の巣を払う女」が、飛行機の中でやっていて運良くそれを見ることができました。すごく印象深い映画でしたよ。

さて、その蒲田の寿司屋さんで出会ったお二人ですが、ご主人は英語と(もちろん)スウェーデン語しか話せられないのですが、僕はついついこれらの映画について話しました。やはりスウェーデンの方にとってもこれらの映画シリーズは有名であり誇りでもあるようでした。でもまだ「蜘蛛の巣を払う女」は見られていませんでした。いやあどこでどんなつながりがあるかわからないですね。色々な知識を絶えず蓄えるのはとても重要ですよね。

そうそう何で駄目な自分か? それはすっかり意気投合してお酒をたくさん飲み、その帰りに iPhoneを紛失したことなのです でも、今日の午後戻ってくる予定です いんあ、世の中まんざらでもありませんね。

Haskell programming 初歩の初歩

先述の直角三角形の三辺長さを求めるプログラムですが

let rightTriangles = [(a, b, c) | c<-[1..10], a<-[1..c], b<-[1..a], a^2 + b^2 == c^2, a + b + c < 25]

とすればきちんと動作します 動作させるためにはまず Haskell compilerを MacBook Proにインストールします それは簡単にできます そしてインストールされたならば terminalから

$ghci

と打ち込みます これにより Haskell compilerの対話モードが起動しますので待受が変わります

Prelude>

という待受になりますので さっきの正しいプログラム文を打ち込めば直感三角形の三辺の長さがタプルというデータ形式で表示されるのです

Prelude>let rightTriangles = [(a, b, c) | c<-[1..10], a<-[1..c], b<-[1..a], a^2 + b^2 == c^2, a + b + c < 25]
Prelude>[(4,3,5),(8,6,10)]

きちんと直感三角形の三辺の長さが二組出力されていますね

ここまではめでたしめでたしですが、ここに至るまでに数日間を必要としました そして次の問題が・・・・・・

気がつけば February!!

あれっ? て気がつけば2月になっていました 何だか色々なことがあり、本当に疲れ切ってこの間に時間が流れていることを意識できませんでした

また、「世の中 矛盾に満ちているよなあ」ということがいくつかありました 「もうやってらんない チャブ台ひっくり返してやる」と思うことがたくさんあるのです

そんな中で自分の心はもっと純粋なものに向かいます それは かねてより分からない、難しい、どうとっついて良いのか?? である Haskellへの挑戦です もっとも何回これまでこのような道を歩み途中で挫折して放り出したことでしょう それでも「純粋関数型言語」とか「モナド」あるいは「モノイド」、「ファンクター」「カリー化」などという何だか訳の分からない しかし魅力的な響きの言葉 これを理解したい そのように思い その象徴たる Haskellに挑戦です

Haskellはとても有名な言語ですが、やはり取り付くのは困難とされているものです しかしその先には意識の革命がある筈です もっともほとんど書籍が無いのです 僕が数年前にAmazonで入手した 「すごい HASKELL 楽しく学ぼう」という書籍がほとんど唯一のものです

この本ようやく購入後数年して読み始めました もちろん iPad Proで Kindleで読み出したのですが、一言で言えば「難しい!!」です

このように新しい言語を学ぶ時には実際にプログラムを書いてテストする作業が必要です しかしこれがなかなか動かない!!!

一つの文が動作するようになるために何日間も必要なのです たとえば本にも出ているのですが、「直角三角形の辺の長さを 1から 10CMの間の整数値で求めよ、しかも合計値が 25未満であるもの」というのがあります

これを Cあるいは C++あるいは Javascript、PHPなどで書くのはまず問題ありません ですが Hasellでは

let rightTriangle = [(a, b, c) | c <- [1..10], b <- [1..10], a <- [1..c], a^2 + b^2 = c^2, a + b + c < 25]

となります

しかしこれはエラーが出てコンパイルできません この解決に数日間要しました ばかみたいなことでした それは

a^ + b^ = c^ という文です これは2辺の二乗の和が長辺の二乗に等しいということを表そうとしているのですが、問題は゜ = です これはプログラミングでは代入を表し、イコールではないのです それが間違いだったのです こんなプログラム書く人にとっては当たり前のことを見落とし時間を無駄に使うのです どうも調子悪いです

すぐ忘れるmysqlコマンド

折角ターミナルで $mysqlと打ち込めば mysqlが CLI (command line interface)で立上るようになったにもかかわらず数日使わないとすっかりコマンドを忘れていました そこで自分で良く使うものをここに書いておきます

## mysql を 「ユーザー名」で立ち上げる うまく立ち上がると passwordを要求される
$mysql -p -u ユーザー名

## mysqlに既に登録されているデータベース一覧を表示
mysql> show databases;

## 「そのデータベース」を使用する
mysql> use そのデータベース;

## 「そのデータベース」のtable一覧表示
mysql> show tables;

## 「そのデータベース」の「そのtable」のフィールドを一覧表示
mysql> desc そのtable;

## mysqlを終了する
mysql> quit;

 

MacBook Pro/MAMP mysqlにパスを通すには?

MacBook Proで Laravelをいじっています 直接 MySQLにコマンドを発行せねばならない場面があり、これまで直接 MySQLをいじくっている時には、phpMyadminを立ち上げ、その中で SQLを発行していました

しかし、これは本来のやり方ではなく、本来的には MySQLコマンドを用いるべきです しかし、MAMPを使用している時にこれをどのようにすれば良いのかさっぱり分かりませんでした 金沢に移動する新幹線の中、この中は長野から富山の間は電波が通じず、インターネットアクセスに難儀するのですが、何とか調べました
$ code ~/.bashrc ## ホームの.bashrcを編集します

そしてここからは visual studio codeの中ですが、そこで以下の文を最後に追加します
export PATH="$PATH:/Applications/MAMP/Library/bin/"

そして terminalに戻りもちろんこれを叩いて反映させます

$ source ~/.bashrc

これで直接ターミナルから mysqlと打ち込めば mysqlを動作することができます 便利ですね

Laravel を MacOSにインストール – つづき

さてようやく MacOS上で composerがインストールできました というか既に何ヶ月か前にインストールしていたのに忘れていたのです

そもそも composerは何か? と言えば、phpを用いて web programを書くときに必要な諸々をサクッとインストールしてくれる便利な小槌と思えばいいのです まず行うことは

$ cd ~/target-folder/

とすることにより、目標とする target-folderに移動します

次いで

$ composer create-project "laravel/laravel=5.5.*" projectName

とすることにより、Laravel version 5.5一式をこのフォルダにインストールします これは大量のファイルをダウンロードしますので数分間かかりますよっ

$ cd projectName

とすることにより今作成したプロジェクト・フォルダに移動します そうすると artisanという phpで書かれたコマンドがこのフォルダには既にインストールされていまので、

$ php artisan --V

とすれば、僕の場合には
Laravel Framework 5.5.44というものが戻ってきました 実はこの artisanというプログラムは local serverを立ち上げるものであり、これで local serverを立ち上げるとその後 Laravelでプログラムを開発する時に面倒なことを考えずにできるのです

$ php artisan serve

これで local serverが  ip address = 127.0.0.1, port = 8000で立ち上がりましたので、ブラウザのアドレス・バーで localhost:8000とするかあるいはhttp://127.0.0.1:8000と打ち込めば見事 Laravelのデモページが立ち上がります

Laravelデモページ