no_picture

モナドがくれたものという話をした - #LT駆動

LT駆動開発18 - 秋(not 安芸)の宮島で「モナドがくれたもの」というタイトルでLTしてきました。雑なLTです。 モナドの利点を問われたので、似ているパティーン(パターン)が除去できるんだぜ。みじかくかけるんだぜ。 「裏で毎回同じことやってくれてるんすよ。これはコンピュータの得意なことだよな。だけど、その内容はモナドの種類によって違うんだぜ」 的な話をしておきました。 動作確認につかったコードはここに投げておきます。

no_picture

モナド則だけ見つめていたい - LT駆動開発14

LT駆動開発14に参加した。 ゼノブレイドクロス発売記念でモナドの話をしといた。 Stateモナドを簡約して、Stateモナドを説明しようとおもったけどうまくいかなくてボツになりました。 Haskell - Stateモナドを手で簡約してみたりしていた - Qiita そんなわけでHaskell/圏論 - Wikibooksを元ネタにモナド則を辿ってみました。 a -> M bって型の関数を並べるにはfmapしてjoinしてを間にはさむことがポイントな気がしたことがあったのでその話です。 a -> M bな関数を組み合わせると M b -> M (M c) になって M (M c) -> M (M (M d)) とどんどんMが増えていってしまうのですが、モナドであればM dにできるわけです。 a -> M bってなんなんだって話になってきますがM a -> M bでも良いけど、a -> M b のほうがあつかいやすいよね。だってMは外せないんだから外れているものが受け取れたら便利じゃないですか。 結果的に残ったものは 何度も同じことをしないといけない部分を隠すことができます。 その内容を自由に取り替えできちゃうのがモナドの魅力なのだと思う。 そしてMに関する操作は裏でひそかに行われて、命令書を構築したり、失敗していたら何もしなかったり、可能性すべてを記録したり、単に設定した値をおけるだけだったり、するだけだと思われます。 関連 Haskell - Stateモナドを手で簡約してみたりしていた - Qiita

no_picture

内包表記について、すごい合同勉強会で話した

すごい合同勉強会2014 in 広島でセッションしたので内容を公開しておく。 今回は「私がモナドの内包表記という名前を知った時の感覚を伝えよう」というのが目的でした。 さりげなく「私がモナドに感じている効能を伝える」というのもしているのですが、そこは本当にさりげなく。 内包表記。その意味を知らずに5年前ぐらいにpythonで利用していて、forやif文字通りにうけとっており、その動作を正しく理解できてないときがありました。 現在とその間にHaskellを学び、その5年前の自分に内包表記を伝えるにはという観点で話を進めました。 まず、リストの内包表記ですが、リストを生成を簡単にしてくれる機能です。 内包表記は、どうやら数学の集合の記法である内包的記法に由来するそうで、「関数プログラミング入門 ―Haskellで学ぶ原理と技法―」か何かで読んだ記憶があります。 その対になる記法として外延的記法があります。 これは具体的な中身を列挙する方法で、普段のリテラル表記ともみなすことができます。 リテラルで地道にかくのではなく、てプログラミングで自動生成しようというのが内包表記と言えそうです。 Haskellの内包表記は ジェネレータとガードと呼ばれる真偽値を並べることで作成します。 x <- [1..9] の部分がジェネレータです。あと真偽値を返す式がガードになります。 参考 3 Expressions - Haskell 2010 pythonではジェネレータとガードが for と if で表現されています。 直感的だし、キーワードの使いまわしとも言えそうです。 (関係ないけど、C++はキーワードの使いまわしたいへんそうだなぁって思った) あとはジェネレータを並べた際にどうなるか、というのがわかればリストの内包表記はうまく使えるのではないかと思います。 直積をとる。つまり、全部のパターンをつくる。 あとはフィルタで、致しているものを求めるだけですね。 そういえば、リストモナドでできることですね。複数答えがある場合にリストモナドを使うとすべての回答が得られます。 よく内包表記がmapやfilterと比較されることがありますが、そもそも同一に扱っても面白いことは特にない気がします。 目的しだいではmapやfilterを使うより便利だと考えてよいと思います。 蛇足ですが、モナドの有効性として、コードが斜めに述びる性質がある際に真っ直ぐに伸ばすことができるみたいなイメージを持っています。 それをさりげなく言っていたのですが、後ではなださんのセッションで実例がでてきました。 さて、ここまでくると内包表記とSQLの類似性が簡単に説明できるし、具体例にしやすいので、SQLと絡めた話をしました。 あとはモナドの内包表記へと一般化する話です。具体例のリストから、Maybeへと繋ぎ一般化して終わりです。 Rubyの例でflattenしている部分がありますが、あの辺はリストモナドがいつも勝手にやってくれてるところで、さりげなく強調していたりしますね。 モナドはなんか怖いとか言われますが、それはさておいて内包表記は便利なので知っておいて損はないと思います。 会場はわりとポカーンとしていましたが「誰かの何かに役に立てばいいなぁ」ということでスライドと簡単な解説を残しておきます。 登場したコード コピペしやすいように置いておきます。 主に対話環境用に。 Haskell [(x,y) | x <- [1..9], y <- [1..9], x * y == 24] [(x,y,z) | x <- [1..9], y <- [1..9], z <- [1..9], x * y * z == 24] :set -XTransformListComp [ (x,y) | x <- [1..9], y <- [1..9], x * y == 24, then take 2] :set -XTransformListComp :m GHC.Exts [ (x,y) | x <- [1..9], y <- [1..9], x * y == 24, then sortWith by y] :set -XMonadComprehensions [ (x,y) | x <- Just 3, y <- Just 8, x * y == 24] Python [(x,y) for x in range(1,10) for y in range(1,10) if x * y == 24] Ruby [*1..9].map do |x| [*1..9].map do |y| [x,y] end end.flatten(1).select do |x,y| x * y == 24 end [*1..9].map do |x| [*1..9].map do |y| [*1..9].map do |z| [x,y,z] end end end.flatten(2).select do |x,y,z| x * y * z == 24 end [*1..9].product([*1..9],[*1..9]).select do |x,y,z| x * y * z == 24 end SQL SELECT x,y FROM generate_series(1,9) AS X, generate_series(1,9) AS Y WHERE x * y = 24; SELECT x,y,z FROM generate_series(1,9) AS X, generate_series(1,9) AS Y, generate_series(1,9) AS Z WHERE x * y * z = 24; 参考文献 内包と外延 - Wikipedia 内包的記法の出展 - 集合 - Wikipedia 5.

no_picture

Haskell のフィールドラベルをもつデータ型について

Haskellのレコード構文というかフィールドラベルをもつデータ型についてなんだけど、苦手意識というか更新の方法を最近までよくしらなくてうまく使えてなかった。 わかったことを含めて書いておく。 フィールドラベルをもつデータ型はざっくりいえば、構造体のようなものである。名前と年齢をもつ「人」を表現する型をつくってみよう。 data Person = Person { name :: String, age :: Int } deriving Show 上記はフィールラベルがないデータ型にいろいろおまけがついてくるだけなので data Perosn = Person String Int とした場合と同じような使い方ができる。 ghci> data Person = Person { name :: String, age :: Int } deriving Show ghci> Person "eiel" 30 Person {name = "eiel", age = 30} せっかくラベルがあるので、生かした使い方をしてみる。 ghci> data Person = Person { name :: String, age :: Int } deriving Show ghci> Person {

no_picture

Haskell で Selenium

たまには Haskell が書きたかったので、コマンドラインからあるウェブサービスに書き込みできるようにしたが失敗した。 失敗したというか画面を進めていくと止まってしまう。 なにやらアラートがでて処理ができていない感じなのだろうか。 Rubyでやっても停止するので、Haskellの問題ではない。 一応、最低限の使い方がわかったのでメモしとく。 利用したのは、hs-webdriver と phantomJS。 phantomJS は –webdriver オプションを使用することで、SeleniumのServerとして使えるようになる。 Haskellでは Selenium と対話するための webdriverというライブラリがあって制御することが可能。 Google にアクセスしてスクリーンショットを作成するプログラムをかいてみた。 {-# LANGUAGE OverloadedStrings #-} import Test.WebDriver import Control.Monad.IO.Class import qualified Data.ByteString.Lazy.Char8 as B main :: IO () main = runSession defaultConfig $ do openPage "http://google.co.jp/" screenshotWriteFile "google.png" screenshotWriteFile:: FilePath -> WD () screenshotWriteFile name = do string <- screenshot liftIO . B.writeFile name $ string 事前に $ phantomjs --webdriver=4444 としてから実行する。

no_picture

LT駆動開発03で「S3にスライドを保存することにした」という発表者をしてきた。

LT駆動開発03 でLTをしてきました。 最近、本当にSSDの容量不足が深刻で仮想マシンなんて作った日にはさっさと用事を済ませて消さないとやばい状態が続いています。 そんなわけで、滅多に使うことのないけど、残しておいたら役に立ちそうなファイルはS3に保存してみることにしました。 それだけだとつまらないので、ついでに一般公開しました。 index.html を作るのに手動で作るのはめんどくさいので、 S3のバケットに保存しているオブジェクトの一覧をAPI経由で取得して、この情報を元に index.html を作成して、アップロードして、静的サイトとして公開しています。 一覧の取得 index.html の作成 index.html のアップロード を自動化しています。 実際のページとソースコードはこちらに。 http://keynotes.eiel.info/ GitHub - eiel/keynotes-eiel S3を使った静的サイトの運用もちょっと試してみたかったので良い機会でした。まだ、調査が必要そうですけども。 自動化はしていない部分であるスライドのアップロードには s3cmd を利用しています。 後半はHaskellの話です。 HaskellのAWSのAPIを叩くには aws ライブラリを使用しました。他にも aws-sdk というライブラリもあるようですが、対応しているサービスが違っているようでした。 元々 Ruby を使ってつくってたのですが、なんとなく理由もなく Haskell でやりたくなってHaskellでやってみましたが、意外と簡単にできました。 Haskell 良いですね。 あとレコード型が実に使いこなせてないことに気づいたので勉強してこようと思いました。 まだ、 keynotes.eiel.info に特化しているのでそのうち汎用性を上げたいと思います。 スライドですが、azusa テンプレートをかなり参考にさせていただきました。 というか、色は少し自分好みに変えただけですね。 赤はもうちょっと明るい色を使うほうがいいなって思う反省点がありました。 そんなわけで、今日はこの辺で。 関連リンク LT駆動開発という勉強会をはじめるよ - そんなこと覚えてない

no_picture

手軽にHaskell できる hawk が楽しい

コマンドラインで Haskell のワンライナーっぽいものが使える hawk ってのがあるらしくて、awk に似ているから hawk っていうらしい。 気軽に Haskell の練習できて楽しい。 インストールは $ cabal install haskell-awk らしい。 hoge:goro:mogu goro:mogu:hoge という入力があって 2列目だけ取り出したーいとかなら $ echo "hoge:goro:mogu\ngoro:mogu:hoge" | hawk -d: -m '!!2' mogu hoge という感じらしい。-m を使うと行ごとの処理がかけて -d を使うとデリミタを認識してあらかじめリストしておいてくれる。 それ意外にも情報源にできる。 奇数のリストを作って10個とりだしてみる。 $ hawk 'take 10 [1,3..]' 1 3 5 7 9 11 13 15 17 19 もちろん無限リストだって作れる。 $ hawk '[1,3..]' | head -n 10 1 3 5 7 9 11 13 15 17 19 ~/.hawk/prelude.hs をいじれば、他のモジュールもインポートできる。 Data.Ix でも追加して遊んでみる。 {-# LANGUAGE ExtendedDefaultRules, OverloadedStrings #-} import Prelude import qualified Data.ByteString.Lazy.Char8 as B import qualified Data.List as L import Data.Ix $ hawk 'range ((0,0,0),(2,2,2))' | head -n 20 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0 2 1 1 0 1 1 1 1 1 2 1 2 0 1 2 1 1 2 2 2 0 0 2 0 1 ひっくくりかえして、 3つとるとかを愚直にかくと、 $ seq 10 | hawk -a 'take 3 .

no_picture

そういえば彼氏募集というネタリポジトリがありましたね。真似するならこんな感じかなぁ。

最近、C++界や、ひろし魔界で暴れているらしいまさかず氏が彼氏募集のリポジトリを真似して彼女募集のリポジトリを作成してました。 条件さえ揃えば真似してもよかったのですが、条件が揃ってなかったので真似してませんでした。 気がついたら条件が揃ってたので真似してみることにしてみました。 eiel/need_a_girlfriend - GitHub やったこと fork したけど 空のブランチつくって、fork元とはコード的には関係をなくした Haskell で DSL したかった。結局、Writer モナドの上に構築した。 source ブランチを push すると travis で README.md を生成して master ブランチに自動で push する リポジトリの名前を変更した fork したけど 空のブランチつくって、fork元とはコード的には関係をなくした fork したので、その上から上書きしてもよかったのですが、だいぶ違うし、ゼロからつくりたいけど fork したことは残したいよね。 ということで空のブランチをつくってから作りました。 git checkout --orphan <branch名> で空のブランチが作れます。 Haskell で DSL したかった。 README.md は手書きせずにプログラムから生成するようにしてみました。 まさかず氏を真似ただけである。 Haskell で DSL 作るのにはどうしたらいいんだろうなぁ。たぶんモナド作ればいいんだろうと、コード書きはじめたけど、途中でよくわからなくなった。 それはそれで別に勉強すればいいやということから途中から Writer モナドでつくりました。 background = do h1 '背景' p 'ほげほげごろごろ' みたいに書きたかった。というか、このように書いてから h1 や p 関数を実装しました。 Writer モナド は

no_picture

流れるようにプログラミングしたい - 合同勉強会 in 大都会岡山 2013 Winter

合同勉強会 in 大都会岡山 -2013 Winter- でライトニングトークをしました。 合同勉強会という名前からわかるように各勉強会からいろんなスピーカーがやってきて、セッションをします。 私はHiroshima.rb・すごい広島・WEB TOUCH MEETING からやってきたという形でライトニングトークをしました。 「流れるようにプログラミングしたい」というタイトルです。 Ruby で読み書きしやすいプログラミングをしたときの問題点を紹介しつつ、Haskell の良いところを紹介するといった内容です。 内容も多かったのでかなりの早口で喋りました。 コードはこちらら Ruby で関数型の思考でプログラミングをすると自然と流れるようなコードになりますが、問題があり、データをすべて読み終えないとプログラムが実行されないという状態になります。 その例が flow.rb のプログラムです。 puts ARGF.each_line .map(&:to_i) # 数値に .map { |n| n * 5} # 5倍する .select { |n| n > 10 } # 10より大きいものだけに .first(5) # 最初の5つ Haskell を使用した場合は、そのまま書いてもこの問題はおきず、現時点で処理できる時点まで処理してくれています。 main = do getContents >>= ( return . take 5 . -- 最初の5個 filter (>10) . -- 10より大きいものだけに map (*5) . -- 5倍する map read .

no_picture

広島Ruby勉強会 #031 で 「Hakyllで遊んだ」のでざくっと紹介した。

広島Ruby勉強会 #031 で かるくLT しました。 内容は Hakyll についてです。 なのですが、Rubyのリファレンスからメソッドの紹介をしているのですが、今回は ActiveSupport で追加される メソッド。Array 編をしました。 その資料はこちらに。 この資料をどこにどうやって置こうかな?と思っていたので、ついでにHakyllを試してみました。そこで学んだこととかを紹介しました。 Hakyllで遊んでみた。 from Tomohiko Himura このサイトのソースコードは Github に丸投げしていたりします。 このスライドに書いてないことでは、コンパイルを毎回するのがめんどくさかったので、ghci から 引数付きで main 関数を実行する方法を調べました。 System.Environment に定義されてる withArgs を使えばできました。 withArgs :: [String] -> IO a -> IO a 利用例: withArgs ["build"] main 第1引数にコマンド引数をリストで渡してしまえば、良いようです。

no_picture

よりよい開発者になるために CodeKata

github の News Feed みてたら codekata というのがあって、なんだっけと思いつつ調べたら 情熱プログラマという本 ( http://amzn.to/d6zjDE ) を読んでいる。 そこにこんなことが書いてあった。 プログラマはしばしば実務の中でスキルを訓練する。 これがミュージシャンだったらどうだろう? 彼らがステージ上で変な音を出しながら練習していたら、観客はどう思う? 練習は、観客のいない密室で、自分の時間を使ってするべきだ。プログラマもそれと同じだ。 なるほど、それはその通りだ。で、この本にプログラミングの訓練の手がかりが紹介されている。 それが「Code Kata ( http://codekata.pragprog.com/ )」 だ。 “Kata”とは、空手の型のこと。 空手の練習は、定められた型を繰り返し反復することで技術を習得していく。 それと同様のコンセプトで、型を訓練し、ソフトウェア開発のスキルを磨きましょう、というものだそうな。 – 言葉をポッケに持ち歩こう なるほど。日々の基礎練習が大切なんですね。 ということで forkして codekata for haskell はじめました。

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.7 仕様

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。引用もしていますし、感想なども混ぜています。 本節は仕様についてです。 仕様と実装の関係について、語られます。 仕様はやりたいこと、実装は実現方法。 そんな感じのことがかかれています。 関数の仕様を表明し、そのやりかたとして引数と戻り値の組を用意する。 単純な実装を行い、よりよい実装にしていく方法が良いとされてます。 すごくBDD感漂うRspec的な手法が勧められていますね。 この手法の難しい点は、 仕様が利用者の要求とずれてしまうかも。 仕様を満たすための検証が膨大になりすぎて証明が大変 ということです。非常に身に覚えがあります。 練習問題 あまりおもしろくない解答をかきました。うーん。面白いの考えたい。 ついでに1章のまとめ。 一度、読書メモを本気でやってみようと思っていたのではじめてみましたが、思うよりもずっとずっと大変でしたが、関数プログラミングに対する基礎知識がグッと固いものになったと感じてます。 通し読みせずにやっているので、読み終わるのはいつになるのでしょうか。 これからもがんばってできる限り続けていきたいです。 関連 メモ用のリポジトリ 1章 1.6の練習問題

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.6 仕様

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。引用もしていますし、感想なども混ぜています。 本節は型についてです。強い型付けがよくわからなくて悩みました。 内容は 型の基本と強い型付け 多相型 型クラス といった感じです 型の基本と強い型付け 値は型という集まりに分類することができて、様々な型があります。 Int, Float, Integer,リスト…などなど。 既存の型を組合せて新しい型も作れます。 (Int, Int), Int -> Int 型固有に演算があり、違う型に利用することは無意味です。意味がないので不当な式となります。 式であれば、必ず型があり、その型は式を構成する要素から推論できます。構成要素から型が決定できるので強い型付けになるようです。(ここがはっきりしなくて悩んだ) 弱い型つけの場合は暗黙のキャストなどにより実行してみないとわからない部分があるようです。 強い型付けの利点は つづりミスや混乱した定義をコンパイル時点で発見できる プログラムを書く際のルールになる だそうです。 引数や結果の型を考えることで型レベルの整合性を保ち、その中で値をやりくりするので、型の枠から外れることも防ぐことができて、明瞭なプログラム設計ができるようです。 多相型 式の型は 構成要素から決定できますが、関数合成や和や積などは複数の型に対して利用できているように見えます。これは型変数を利用することでこのような定義ができます。 「それって強い型付けなの?」という疑問に教われるのですが、型変数を含んでいても型なので問題がないようです。 曖昧であれば不正な式になるのだと思います。その場合は推論に任せず型指定をすることになります。 このように型変数を含む型を多相型と呼びます。 おまけで (->) は 型演算子 だそうで、右結合だそうです。Int -> Int は -> で演算して新しい型を作るとも言えます。 型式というものがありそうですが説明されてません。 型クラス 和や積をするつあめの (+), (*) がありますがこれを型変数で定義するには一般的すぎます。数値であるようなものであれば扱えて欲しい。 そのような似た型をまとめる型クラスという機能があります。型変数に制約をつけることができます。数値であるような型は Num クラスのインスタンスとなります。 Num a => a -> a -> a とかいたとき a がNumクラスのインスタンスであるという制約のもとで、 a -> a -> a

no_picture

@souda1025 に PythonでFizzBuzzとかしてみた に対抗しろって煽られたので。

@soudai1025 が書いたブログ記事にPythonでFizzBuzzとかしてみたというエントリーがあるのですが、Facebookでこういうコメントをみた。 多分、ひむひむが対抗してくるはず。 全力でお答えしましょう。 とりあえず、普通 FizzBuzz かくならこうかくだろう。 def fizzbuzz(number): if number % 15 == 0: # number % 5 == 0 and number % 3 == 0 return "FizzBuzz" elif number % 5 == 0: return "Buzz" elif number % 3 == 0: return "Fizz" else: return str(number) if __name__ == '__main__': number = int(raw_input("Please enter an integer: ")) print fizzbuzz(number) 数値を入れると 数値の文字列 か “Fizz” か “Buzz” か “FizzBuzz” を返す関数を用意するほうが柔軟性があり、わかりやすいです。 さて、もとのコードを確認していきましょう。 int = int(raw_input("Please enter an integer: ")) def do_fizz(int): if (int % 3) == 0: return 1 return 0 def do_buzz(int): if (int % 5) == 0: return 2 return 0 def do_answer(fizz, buzz): flag = fizz + buzz if flag == 0: print int #引数に居なくても外のintを参照出来る elif flag == 1: print "Fizz" elif flag == 2: print "Buzz" elif flag == 3: print "FizzBuzz" do_answer(do_fizz(int), do_buzz(int)) さて、気になる点をあげていこう。 do_answer 関数が外のスコープにアクセスしている。 よくわからないフラグ処理がされている。 do_answer の引数が意味不明。 関数が外のスコープにアクセスしている 関数が外のスコープにアクセスしてしまうとその関数だけみたときに他の部分を確認しないといけないのでよくない。 それぐらいなら引数を追加しましょう。 よくわからないフラグ処理がされている do_fizz と do_buzz が関数名から何をするのかさっぱりわからない。 do_fizz は 3で割り切れる場合 1 を返し、それ以外の場合は 0 を返す関数である do_buzz は 5で割り切れる場合 2 を返し、それ以外の場合は 0 を返す関数である ということはコードをよまなければわからない。ならば、関数の頭にコメントをかくか、そのような名前の関数にすべきだと思う。 do_ という接頭辞が着いている以上何かする関数だと想像するので、ここで print されているのであれば、まだ良いと思うけど, iPhoneで閲覧していたらこの命名のせいで混乱しました。 do_answer の引数が意味不明 fizz って何?

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.5 定義

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本節は定義についてですが、前節につづき関数ともいえそうです。 内容は * ガード付等式 * 再帰定義 * 局所定義 です。 ガード式の前に関数だけじゃなく、他の値も定義できるという話がでてきますが、それ以上でもそれ以下でもないです。一般的なプログラミング言語なら定数ともいえそうです。 つづいて、ガード付等式です。ガード 付等式 か ガード付 等式悩みましたがたぶん後者でしょう。 まだ、登場していませんが、パターンマッチよりも細かいところで分岐させるのによく使います。数学のノートみたいに見えてよいです。一応例をだしておきます。 compare x y | x > y = LEFT | x == y = EQUAL | x < y = RIGHT LEFT、EQUAL RIGHTの定義をしていませんが、比較して大きいほうを返す関数です。よみやすいです。このように3パターン以上に分岐する場合は if を使用するよりもよみやすくなります。 ifを使うと compare x y = if x > y then LEFT else if x == y then EQUAL else RIGHT みたいな感じでしょう。 再帰定義 あまり文章での説明がなかったです。関数の中で自分の名前が使用できます。実際に手を動かして簡約してみると、再帰というものが存在して良いことが確認できると思います。 ただし、終了条件がなければ収束することなくどんどん大きくなります。 局所定義

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.4 関数

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本節は 関数 について。 要点は 外延性 カリー化 演算子と関数 優先順位 結合順序 関数合成 です まず関数は値として扱えますが、表示することはできません。引数を適用することで表示できる場合があります。 また、関数は 引数の値 を戻り値 の型に変換する(対応をつける)役目をもちます。関数の型を示すには -> 演算子を使い 型A を受取り 型B を返す場合 A -> B とかきます。 関数 と 関数に値を適用したものを混同しないように気をつけたほうがよいそうです。 外延性 関数が等しい場合は任意のxに対し以下が成立します。 f x = g x この方法は関数に値を適用した結果が一致するので 適用的証明 というそうです。また ポイントワイズスタイル ともいうそうです。このように f や g はブラックボックスですが、引数と結果で確認できるので外延性の原理 逆に定義から f = g を示す場合はポイントフリースタイルというそうです。ただし、効率が違う場合があり、これは内包的性質というそうです。 カリー化 単一の引数の関数の複数の引数に分解できます。こうすると関数に引数をひとつだけ適用すると新しい関数を作成することができます。結果が変わらないので括弧が減ったり、引数を変えるだけで様々な効果をもつ関数がつくれる利点があります。Arrow を使う場合は逆に アンカリー化をする場合もあります。 演算子と関数 演算子も実質的には2引数の関数ですが中置することができます。Haskellでは 括弧で演算子を囲むことで通常の関数にもできますし、関数をバッククォートで囲むことで演算子のように利用できます。また、括弧で演算子を囲む場合は (+1) のようにして あらかじめ引数を適用したりもできます。これをセクションというそうです。 優先順位 結合順序 これらのおかげで 括弧を省略することができます。 これらの把握しておかないとHaskellのコードを読む際によくわからなくなるのでしっかりと慣れておいたほうが良いです。 関数は最優先で左結合です。 f x y + z であれば ((f x) y) + z と等価です。 右結合か左結合か は演算子によって違いますが、どちらでも同じ結果になるものもあります。これを結合性というそうです。+ や * は結合性があります。 関数合成 関数合成は関数と関数を演算できます。結合性です。 ある関数の結果を別の関数の引数にできる場合に利用できます。 f (g x) が正しい場合 (f .

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.3 値

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本節は 値 について。 値と式の関係。値と正格関数、非正格関数。がメインです。 値は 式を用いて表現できます。値を表現する式はひとつだけではなく、複数存在し、評価機が出力する表現は 標準表現 が利用されます。基本的には評価可能な式が表示されるということのようです。Rubyでいうと pメソッドの出力結果に近そうです。 また、値を表示しようとすると停止しない可能性が存在します。このような状態になる関数を正格関数と呼びます。具体的にシンプルに定義されてるのでわかりやすいです。正格でない関数は非正格なりますが、これは遅延評価でないと定義できないそうです。 練習問題は正格と非正格について考える問題でした。 関連 メモ用のリポジトリ 1章 1.3の練習問題

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.2 評価

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本節は評価を中心に式の簡約化についての説明です。 正規形という形を目指して式を簡略化していきますが、関数プログラミングにおいては、どのような手順で簡約しても最終結果が一致するのが特徴です。 代入のような破壊的な操作が存在する世界では、順序が影響します。 そこが命令型のプログラミングと違うところでしょう。そのため並列処理させるたべ順序に影響しないため、関数プログラミングが評価されてる部分だと思います。 話が脱線しましたが、簡約の手順には 1つだけでなく複数存在する可能性があります。そのためプログラミング言語によっては簡約の評価戦略が違うようです。 あと、簡約の手順が違う場合、停止しない場合が存在することもあります。 練習問題は評価の順序、停止性について考えるような問題でした。 関連 メモ用のリポジトリ 1章 1.2の練習問題

no_picture

読書メモ 関数プログラミング入門 Haskellで学ぶ原理と技法 1.1 セッションとスクリプト

関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。 本書は 2002年に出版されたIntroduction to Functional Programming using Haskell の2版の翻訳です。 いまになって日本語に訳されたということはそれなりの名著なのかなー。ということで、Haskellネタを書く機会があまりなかったので、読書メモを書いていこうと思います。 問題を解いてくのに最強の環境をつくろうぜ。と、意訳できる文章ではじまります。本節は Hugs を使用することを想定して セッション、スクリプトといった対話環境だからこそしっくりくる用語を中心に基本用語が解説されています。 スクリプトによって定義を追加していき環境を構築した上で 式を評価 するというのが主軸なのかなあ、と思います。環境/文脈は束縛の集りであるというのは非常にシンプルで実際の文脈の小ささは関数プログラミングの特徴と言えるのではないかな、と思いました。 あとは、定義には関数の定義がかかれ、関数には 型シグネチャ をかけることぐらいかな。 練習問題が関数定義の練習と束縛済みの関数を再利用するのが目的な感じでした。 関連 メモ用のリポジトリ 1章 1.1の練習問題

no_picture

プログラムミングにおけるモナドと圏論との対応。

説明するわけではないです。メモです。 Kleisli圏 をキーワードに調べると気になるということがわかったのでメモしておきます。 その中で気になったもの tnomuraのブログのブログ - モナドのKleisli圏 関数型プログラマのためのモナド理論 はじめての圏論 その第1歩 単にHaskellをするのに圏論の理解は不要です。使うだけなら馴れるだけで十分だと思います。モナドの表現力がどのようなところまであるのか、そのあたりを知りたいのです。