2011年11月30日
今日の迷惑メール
- 2011-11-30 (Wed)
- 一般
タイトル「魔女の宅急便のキキについて」
本文「魔女の宅急便のキキは自分の事しか考えてない」
……
だから何なんだか.
- Comments: 0
- TrackBack (Close): -
トラックボール導入
- 2011-11-30 (Wed)
- 一般
なんとなくトラックボールを導入した.Logicool の M570.Unifying レシーバ対応なのでキーボードと一緒にレシーバ1つで済むのが有難いかも.
とりあえず,左クリックをしようと思ったときにボールを押し込む動作をしてしまう癖があるらしい事が判明した.なぜだらう? 親指が痛い……
- Comments: 0
- TrackBack (Close): -
RecordWildCards が便利だなぁ
Type class で可換半郡を次のように書いていた.
class CommutativeMonoid a where oplus :: a -> a -> a, -- commutative, associative identity::a -- the identity of oplus data Bag a = Bag [a] deriving (Show,Ord,Read) instance CommutativeMonoid (Bag a) where oplus (Bag a) (Bag b) = Bag (a ++ b) identity = Bag []
んで,type class だと不都合が生じたのでレコードで演算をまとめて持ち運ぶようにしたのだけど,定義部分に限っては RecordWildCards を使うとほとんど同じように書ける.演算の集合を定義するという点では type class でもレコードでも手間は大して変わらないっぽいねと. 楽だし簡潔でいい.
data CommutativeMonoid a = CommutativeMonoid { oplus :: a -> a -> a, -- commutative, associative identity::a -- the identity of oplus } data Bag a = Bag [a] deriving (Show,Ord,Read) bagMonoid = CommutativeMonoid { .. } where oplus (Bag a) (Bag b) = Bag (a ++ b) identity = Bag []
インスタンス宣言に同じクラスの別のインスタンスを使う,例えば
instance (CommutativeMonoid a, Ord c) => CommutativeMonoid (Map c a) where oplus x y = unionWith oplus x y identity = empty
とかも
mapMonoid m = CommutativeMonoid { .. } where oplus x y = let CommutativeMonoid {..} = m in unionWith oplus x y identity = empty
と書けばほとんど同じ雰囲気かね.let を内側で使ってあげるのが大事.下のようにやると定義の本体の oplus が新しく定義される oplus になっちゃうのでエラーを食らう.
mapMonoid (CommutativeMonoid {..}) = CommutativeMonoid { .. } where oplus x y = unionWith oplus x y identity = empty
- Comments: 0
- TrackBack (Close): -