Haskellに惑わされ – 9

もうむちゃくちゃ Haskellの難しい世界に完全にやられています 何が何だかさっぱり分からない それでも頑張って前に進むのだ きっとこの森を超えればこれまで見たことも無い世界が広がっているのだ それを信じて進むしかない

ところで、例の’\’というのは要するにギリシャ語の ‘λ’という文字に似ていますね、それでこの記法を「ラムダ式」と呼ぶのです 正確には「ラムダ関数」でしょうか 関数というのはある入力 aが入れば、何らかの操作をその aに対して行い、結果 bを返すものですね この時重要な概念としては、この関数 (ここでは便宜上 f と呼びます) f に aという入力をすれば、必ず bというものが返る、という点です

ただ、名前 f というのは本質的で無いので、ここは何でも良い、そんな意味で \ というものを使用するのです つまりこの関数が行う操作そのものが重要で名前はどうでも良いのです これを ラムダ関数と呼びます

Haskellに惑わされ – 8

それでは自己設問の3に移ります ここはMac日本語キーボードに限定します さて “\” という斜め棒はどうすれば打ち込めることができるでしょうか?
これって悩みますよね
実は Macの場合 Option Keyを押しながら ¥キーを打つと この斜め棒になります

やってみてくださいね

Haskellに惑わされ – 7

これで先の自己質問1に対する回答となりましたね、シングルクォーテーション `はプログラム上何の意味も無いものであり、従って名前の一部にもならないのですね

だから Haskellでも add’という名前は許されても、add`という名前は許されません もちろん、ここで addと add’とは別物とみなされますので、この性質は もともとある名前と似た作用を有する名前を命名する時に便利です

たとえば、Haskellの Prelude frameworkにはもともと addという関数が定義されているので、自分で新たに add = 加える という意味を有する関数を作成したとしても、addという名前を使用できません

こんな時に add’とすれば別物とみなされ自分で新たに定義した関数をadd’という名前で使えるのですね

こんなことを理解するにも数日間頭を悩まされました バカみたいなことだけど、きっと世の中には僕と同じような悩みを抱えて Haskell programmingから挫折した人は何人もいるのだろうと思います

まあこれで

Haskellに惑わされ – 5

の自己設問1と2は解決ですね

Haskellに惑わされ – 6

例えばこうです 僕が良く Web programmingする時に使用する PHP言語ですが、database言語であるSQL (僕が使用しているのは open sourceの MySQL言語です)と連携してSQLサーバーよりデータを取得し、それをサーバー内で PHP言語により加工し、その結果を http通信でクライアント側 つまり、一般ユーザーに送っているのですが、その部分の肝腎の SQL serverからの PHPでのデータ取得部分の一例はこんなものです

$row_session = $stmt_session->fetch( PDO::FETCH_ASSOC );
$stmt_role = $pdo->prepare( "SELECT MAX(`created`) FROM `role_tbls`;" );
$stmt_role->execute();

ここで出てきましたよね この部分です

"SELECT MAX(`created`) FROM `role_tbls`;"

この部分を良く見ると、

`created` や`role_tbls`

のように何だかさっきのもの (`)ではさまれていますね これは実は SQL構文規則では不要なものです しかしながら、この列が SQLの列名であることを分かりやすくするためにわざわざ用いているのです

つまり、 (`)というものはプログラム解析上では何の意味も持たない飾りだということです

従ってこの部分に(‘)というものを使用すると途端に文法エラーとなりプログラムは走りません これと同様のことが Haskellでも起こるのです

Haskellに惑わされ – 5

さて Haskellで整数mと nを足す関数 add’というのを作りましょう もちろん一人ではできないので、書籍を読みながらですが・・・

Prelude>add' = \m n = m + n :: Int

ということになりますが、何やら訳のわらない記号が出てきました そもそも addという関数名に何で ‘ というものがついているのでしょうか? これは何と呼ぶのでしょうか Macのキーボードでは 7のキーをシフトして押すものです これはどうやら「アポストロフィー」と呼ばれるものです

間違いやすい記号で Macでは「@」のキーをシフトしながら押すと出てくるものでこれはどうやら シングルクォーテーションマークと呼ばれるものです

見かけは似ていてもプログラムの中で使用する場合には全く意味が異なりますので注意ですね!!

実はこれだけのプログラムを書くだけでも落とし穴があり、大抵の人はそこで早期に脱落するのです、たとえば

  1. そもそも’なのか `なのか どちらなのか
  2. 何で’なんて使うのか
  3. \という変な傾きの棒はどのように打ち込むのか
  4. :: Intとは何なのか

こんなところですね

これについては そろそろ外来診療せねばならないのでまた後でね

Haskellに惑わされ – 4

なかなか難しい局面に直面です

Haskellを走らせるのにどうやら stackというツールを最低でも使用すべきだ、と読んだので  http://www.haskell.org/ghc/ より haskellプログラムをインストールしたのです

インストールは簡単であり、僕の現在の場合、GHCi, version 8.6.3がインストールされました

その後読んだ文章では、どうやら stack というツールをインストールすべきだと書いてあったので、今度は

$brew install stack

として stackをインストールしました そして、訳の分からないまま

$stack setup
$stack path
$stack stack exec ghci

として stackの下で ghciを走らせると何と以下のように

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

と出ました そうなんです versionが新しいものが走っているのです、では? では? 最初に直接インストールしたものは何処に??? どうやってその無駄な古いものを消せばよいのか???

なんだかさっぱり分からない

泉川ライブから東海大学八王子病院へ そしてTAVI、経皮的僧帽弁接合不全修復システム (MitraClip)

日にちがコロコロと入れ替わり、今何をしていて今何をすべきか その境界が曖昧になっていく それでも時は流れ、いやどんどんその流れは加速していく それが人の営みなのでしょう 世界はどこに向かうのか? それを思うと不安になることもあるが、その結果を知る前に自分という存在は消えていくのでしょう

前回の日曜日には JTVTで忙しく、それが開け 7月19日金曜日には島原に移動、翌日 20日は島原ライブで怒涛のように 6症例を行いました 最後の冠動脈バイパス手術術後の患者さんに対しては本気で攻めましたが、完璧な結果は得られませんでした しかし良い治療をしたと思います あいにくと台風の接近に伴い激しい風雨でしたが、島原鉄道にこのような電車も走りました

島原鉄道
島原鉄道先頭のシンボル

翌日日曜日には鎌倉に戻ったのですが、鎌倉はすごい湿気で蒸し暑く、とても「夏」という気持ちにはなれなかったのです

22日は東海大学八王子病院で2症例の治療をさせて頂きました

東海大学八王子病院カテ室
東海大学八王子病院カテ室

そして翌日23日はTAVI 2例と経皮的僧帽弁接合不全修復システム (MitraClip) 1例 そんなふうに時間の流れを振り返っている内に今朝となりました これからPCIです

ささやかな楽しみ

今朝は少し遅刻して札幌東徳洲会病院心臓センターに出勤 遅刻といっても現在 7:30AMです

新道東交差点角による TSUTAYA/Family Martで、まずは Iced Cafe Lateを購入 Suicaが使えるので便利ですねえ

流石にその場で機械がコーヒー豆を挽き、それからきちんとコーヒーを抽出し、それを氷一杯のカップに注ぐので何と素晴らしい香りでしょうか 朝のひと時のんびりと過ごし、今日一日に備えます 素晴らしい時間が過ぎて行きます

とは言え、そんなにのんびりはできません そろそろ腰を上げて現実の世界に戻りましょう

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環境で打ち込んでもダメなのです これが分かるのに相当に時間を浪費しました しかしその副作用で頭脳回転が早くなりましたね