Okada Hiroshi の blog

typo が多いです

Haskell 勉強記録 5 日目

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

今日は 第5章:高階関数 高階実演 (位置 1661/11175)読み進めました。

flip の実装は思いつけませんでした。

flip' :: (a -> b -> c) -> b -> a -> c
flip' f = g
    where g x y = f y x

where 以下のような記述が思いつくようにできるようになるまでにはもう少し時間がかかりそうです。

Haskell 勉強記録 4日目

今日は 第四章: Hello再帰! さらにいくつかの再帰関数 のzipまで(位置1400/11175)読み進めました。

再帰関数はなるべくテキストを見ないで自分で実装してからテキストで答え合わせをするという方法で進めました。

take の実装でガードで otherwise を使わずに次のパターンマッチにマッチさるというのを思いつかず上手く実装できませんでした。

take' :: Int -> [a] -> [a]
take' n _
    | n <= 0    = []
take' _ []      = []
take' n (x:xs)  = x:take' (n-1) xs

これを見たあとで、このテクニックを使わなくても実装できると思ってこういう実装を書いてみました。 haskell 的にどちらの実装が適切かはまだ理解していません。

take'' :: Int -> [a] -> [a]
take'' _ [] = []
take'' n (x:xs)
    | n <= 0        = []
    | otherwise     = x : take'' (n-1) xs

Haskell 勉強記録 3日目

今日は 第三章: 関数の構文 where?! まで(位置1204/11175)読み進めました。

  • (寄り道)コメントの書き方
    -- が行コメントの始まり、{- -} で囲むとコメントになるという事です。
  • {-# OPTIONS -Wall #-} と設定したので、サンプルのままだと警告が表示されました。
    • This binding for `all' shadows the existing binding
      all が既に束縛済みという事なので、別な名前にしました。
    • Defaulting the following constraint(s) to type `Integer'
      height ^ 2height ^ (2 :: Int) のように型を明示しないといけないようです。

Haskell 勉強記録 2日目

今日は 第三章: 関数の構文 パターンマッチの途中(位置1086/11175)まで読み進めました。


head' :: [a] -> a
head' []    = error "Can't call head on an empty list, dummy!"
head' (x:_) = x

では x:_ を丸括弧で囲わなくてはいけないけど

badAdd :: (Num a) => [a] -> a

では (Num a) の丸括弧は不要のようで、今ひとつ演算子?の優先順位が感覚的に理解できていません。


ソースコードファイルの先頭に

{-# OPTIONS -Wall #-}

と書くと読み込んだ時に警告を表示してくれるので便利とのことなので、そうすることにしました。

新年度なので Haskell の勉強を始めました。

もう会社員ではないので新年度といっても特に何もないのですが、何か新しい事を始めようと思って今日から Haskell の勉強を始めました。一日2時間程度の時間を割くつもりです。

一応、3日坊主にならないように blog に記録をつけることにしました。

今日は、とりあえず何時も使っているデスクトップに haskell-platform をインストールしました。 (といっても lubuntu なので $ sudo apt-get install haskell-platform とタイプしただけ ) また vimGitHub - raichoo/haskell-vim: Custom Haskell Vimscripts を入れました。

とりあえず一番優しそうな すごいHaskellたのしく学ぼう! を読み始めました。

今日は、第一章:はじめの一歩 のリスト内包表記の途中まで読み進めました。

  • True False が最初大文字なのは、関数でないという事を明示しているのだろうか?
  • ghci では定義済みの関数を TAB で補完できて便利だ。
  • 本には、Haskell は if が関数だから else が必要と書いてあったが、むしろ、型を静的にきめなければならないから else 節が必須なのだと思った。(そうでなければ、else を省略した時 null を返すとかいう仕様でも良いはず)
  • 普通の関数は右結合ではない succ succ 1 とは書けない func (func 1) が : は右結合のようだ、この辺のルールは覚えるしかないのか?
  • ghci で "あ" と入力すると "\12354" と表示される UTF-16なのかな、ちょっと非 ASCII圏には不親切な仕様かもしれない。
  • 最後の要素を除いた残りのリストを返す関数の名前がなんで init なのだろう。

ページのタイトルとURLを取得する Chrome 拡張を作ってみました

お勧めの Web ページの一覧表とかを作るときに、いちいちページタイトルとURLをコピーして組み合わせるのが、するのが面倒くさいかったので、勉強も兼ねて Chrome 機能拡張を作ってみました。

同じような機能拡張は結構あるのですが、 Textile とか Markdown とかでドキュメントを作っている場合には便利かもしれません。

f:id:OkadaHiroshi:20150206195007p:plain

機種変更して Fx0 を買いました

しばらく、ガラケー + Nexus 7 という構成でスマートフォンを使わない生活をしていましたが、 Fx0 という Firefox OSスマホAU から発売されたので、ガラケーを機種変更して購入しました。

f:id:OkadaHiroshi:20141225204802j:plain

とりあえず初日につかっってみて
  • 動作は十分に快適でもっさりとした所はありません。
  • カメラは普通だとおもいます。まあ僕がいつも使っている Nexus 7 (2013) に比べるとどの機種でも優れているのですが。
  • 最低限のアプリは揃っていますが、iOS機や Android機に比べるとどうしても不足しています。
    • 僕の場合でいうと Foursquare がなかったのと、 Dropbox の正式クライアントが無いのが痛いです。
  • 最初に SMS/MMS の設定をしないと行けません(少し面倒な手順)。僕は結構ちゃんとマニュアルを読む方なので問題なかったですが、いきなり使ってみるタイプの人だとはまるかもしれません。
    • 僕は2段階認証で SMSやMMS を使っているので、届かないと少し困ったことになるのです。
  • まあ、これはほとんど全てのスマホに言えるのですが、ストラップ穴は欲しかった。今回も無理やり糸で付けています。
  • 設定等は比較的わかりやすく見やすいと感じました。
無理やりつけたストラップ

f:id:OkadaHiroshi:20141225210033j:plain

通信量の表示

f:id:OkadaHiroshi:20141225204808p:plain

メールソフトの表示

f:id:OkadaHiroshi:20141225204815p:plain

Fx0 のカメラで撮った近所の喫茶店のハヤシライス

店内が少し暗いのですが、そこそこ良く撮れています。

f:id:OkadaHiroshi:20141225204825j:plain

https://dl.dropboxusercontent.com/u/1427632/IMG_0004.jpg

あとこの機種とは関係ないんだけど Line を複数の端末にインストールすると前の端末で情報が消えてしまうのを初めて知りました。