助け舟到来か

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

うーん 難しいけどがんばるぞ

先日の衝撃的な記事を受けて、関数型プログラミング言語 Haskellの勉強を開始しました 何でも毎年一つの新しいプログラミング言語に挑戦し続けることが、プログラミング能力を高める秘訣だそうですから・・・

その言語定義は、完全には日本語に翻訳されていませんが、詳細に定義・公開されています まあこのような文章を読んだだけで理解できるようになるには相当に訓練せねばならないでしょう

何はともあれ、その言語処理系が動作しないことには試すこともできません そこで、ここから OSX-Mavericks用の処理系をdownloadして MacBook Proにインストールしました ここで、コンパイラが Maverickから gcc (GNU Compiler Complex)から clangに完全に変更となっているため、パッチを当てねばならない、ということで、そのページにある Shell scriptをコピーして実行します

そうそう実際に OSX Mavericksに 実際に GHCをインストールして動かした報告がこのプログに書いてありましたので、とても参考にさせて頂きました

そうすると、ターミナルから ghci と打ち込むと Haskellがインタープリター・モードで動き出します

後は iPad-miniのKindleアプリにダウンロードした「すごいHASKELLたのしく学ぼう!」を読みながら勉強開始 長い旅路の始まりです