またまた 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本ではこの部分縦棒が揃っていないのですから・・・

久しぶりに brew update/upgradeしてみたら・・・

Haskell systemを upgradeしようとしてまずは Homebrewで

$brew update
$brew upgrade

してみたのです そうしたらば、gccの upgradeで異様に時間がかかり、一見すると停止したように見えたのです しかしながら terminalの表示では compilerが作動しているように見えます。20分ぐらい待ったのですが埒あかないので検索したところ同じような経験された方のページがありましたので、それを参考に今しばらく待っていたところようやく先に進み終了しました。良かった

まったく駄目な自分

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

もちろん、医師としての自分の、いやこれで医師なのだろうか? 今どこかの現場、あるいは疫病が蔓延する地域に放り込まれた時、あるいはそこまでではなくて通常の日常診療に放り込まれた時、そんな時自分は医師として何らかの善を成し得るのだろうか? 既に医師 –> 内科医 –> 循環器内科医 –> インターベンション専門医 –> 経カテーテル的大動脈弁植え込み術・経皮的僧帽弁接合不全修復システム (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を紛失したことなのです でも、今日の午後戻ってくる予定です いんあ、世の中まんざらでもありませんね。

ようやく歩けるように

さてさて登山の日から丸5日経過してようやくまともに歩けるようになりました 未だ筋肉痛は残っていますが、階段も登れるようになりました

二日前の火曜日はTAVI 3件 + MitraClip 1件でしたが、 16:00に終了しましたね 経皮的僧帽弁接合不全修復システム (MitraClip)の場合、僕は座っての手技が多いので足の筋肉痛は関係ないのです

さて Haskellまたまた迷いが出てきました この年齢になると本を読んでもなかなか頭に入らず、何回も振り返って確認する作業が必要なのですが Kindleで記号を検索するのはなかなか効率的では無いのです それで時間がかかります Haskellの場合記号に意味がある場合が多いので それが十分に頭に入るまでは苦労しますね

代数的データ型

何やら訳も分からずに使っていた data という型ですが、これは代数的データ型 という特別な「型」なのだそうです

それを実現しているのは Preludeという Haskellの Interpreter/Compiler system GHCiに付属する標準的なライブラリー (この呼名で正しいのか知りません)のようです 何だかさっぱり分かりません つまり

data Human = Human String derived Show

というのは data型から発生したHumanを定義して、それはString型の変数を持ち、Showという性質を引きずる ということのようです

ものすごく曖昧な理解です とにかく難しい

助け舟に乗り、Haskellの川を少し上れました

ご指導のおかげでようやく正しいプログラムを書くことができました 書籍を詳細に読めば分かることも闇の中、霞の中をさまよう自分にとっては読んでも頭に入らず分かり無いままとなっていたのです

正しいプログラムは下記です

data Human = Human String deriving Show
data Dog = Dog deriving Show
data Cat = Cat deriving Show

class Greeting a where
    name :: a -> String
    hello :: a -> String
    hello _ = "..."
    bye :: a -> String
    bye _ = "..."

instance Greeting Human where
    name (Human n) = n
    hello h = "Hi, I am " ++ name h ++ "."
    bye _ = "See you soon."

instance Greeting Dog where
    name _ = "a dog"
    hello _ = "Whaon"

instance Greeting Cat where
    name _ = "a cat"
    hello _ = "Meow"

これによりエラーも無くなりましたし、正しく動作しました なんとなく理解できました

助け舟到来か

今朝方 uploadした「Haskellに惑わされ」という投稿に対して、親切にも助け舟が入りました しかしながら、僕自身助け舟に乗る資格があるのか否か分かりませんが・・・・

現在 Kindleで本間 雅洋、 類地 孝介様の書かれている 

Haskell入門 関数型プログラミング言語の基礎と実践

というもので勉強しています その中に書かれている例題

class Greeting a where
 name :: a -> String
 hello :: a -> String
 hello _ = "..."
 bye :: a -> String
 bye _ = "..."

instance Greeting Human where
 name (Human n) = n
 hello h = "Hi, I am " ++ name h ++ "."
 bye _ = "See you again!"

というものを $ghciでコンパイルすると

[1 of 1] Compiling Main             ( myfunctions.hs, interpreted )

myfunctions.hs:44:19: error:
    Not in scope: type constructor or class ‘Human’
   |
44 | instance Greeting Human where
   |                   ^^^^^

myfunctions.hs:45:8: error: Not in scope: data constructor ‘Human’
   |
45 |  name (Human n) = n
   |        ^^^^^
Failed, no modules loaded.

というエラーが出て compileに失敗するのです

正直のところさっぱり分かりません この Monoidとか Monadとかを理解するには自分の能力が far awayと感じます

というのを、助け舟に感激してTAVIの合間に書いてしまいました

Haskellに惑わされ

先日来 純粋関数型言語 Haskellの勉強を初めています これが今までのプログラミング言語とは質が異なる難しさなのです 本当に何が何だか訳が分からん

頼りは Kindleで購入した Haskellの書籍です これも数種類あり、その中の Kindleで download可能な書籍5冊を購入し、読み始めました しかし、その中の二冊はあまりにも難解な解説なので脱落、残りの三冊をあっち読んだり、こっち読んだりしながら理解を少しずつゆっくりと進めています しかしまた難点に衝突です

class Monoid a where
  mempty:: a
  mappend:: a -> a -> a
  mconcat::[a] -> a
  mconcat = foldr mappend mempty

instance Monoid [a] where
  mempty = []
  mappend = (++)

これが compile errorとなるのです どうしても理解できません これよりか先に進めるのでしょうか???

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