独習 Scalaz: 12日目

in

更新された html5版があるので、よろしくお願いします。

reynaldo f. tamayo for openphoto.net

11日目には入れ子になった不変データ構造へのアクセスする方法を抽象化したものとしての Lens をみた。

今日は論文をいくつか飛ばし読みしてみよう。まずは Jeremy Gibbons さんの Origami programming だ。

Origami programming

Gibbons さん曰く:

In this chapter we will look at folds and unfolds as abstractions. In a precise technical sense, folds and unfolds are the natural patterns of computation over recursive datatypes; unfolds generate data structures and folds consume them.

foldLeft4日目Foldable を使ったときにみたけど、unfold って何だろう?

The dual of folding is unfolding. The Haskell standard List library defines the function unfoldr for generating lists.

Hoogle には以下の例がある:

Prelude Data.List> unfoldr (\b -> if b == 0 then Nothing else Just (b, b-1)) 10
[10,9,8,7,6,5,4,3,2,1]

独習 Scalaz: 11日目

更新された html5版があるので、よろしくお願いします。

Darren Hester for openphoto.net

昨日はコンフィギュレーションを抽象化する方法として Reader をみた後、モナド変換子を紹介した。

今日はレンズを見てみよう。色んな人がレンズの話をして盛り上がってきてるトピックだし、使われるシナリオもはっきりしてるみたいだ。

進め! 亀

今年の Scalathon で Seth Tisue さん (@SethTisue)shapeless の Lens の話をした。残念ながら僕は聞けなかったけど、使われている例は借りさせてもらう。

scala> case class Point(x: Double, y: Double)
defined class Point
 
scala> case class Color(r: Byte, g: Byte, b: Byte)
defined class Color
 
scala> case class Turtle(
         position: Point,
         heading: Double,
         color: Color)
 
scala> Turtle(Point(2.0, 3.0), 0.0,
         Color(255.toByte, 255.toByte, 255.toByte))
res0: Turtle = Turtle(Point(2.0,3.0),0.0,Color(-1,-1,-1))

独習 Scalaz: 10日目

in

更新された html5版があるので、よろしくお願いします。

9日目TreeLocZipper を使った不変データ構造の更新する方法をみた。また、IdIndexLength などの型クラスもみた。Learn You a Haskell for Great Good を終えてしまったので、今後は自分でトピックを考えなければいけない。

Scalaz 7 で何度も見て気になっている概念にモナド変換子というのがあるので、何なのかみてみる。幸いなことに、Haskell の良書でオンライン版も公開されている本がもう 1冊ある。

モナド変換子

Real World Haskell―実戦で学ぶ関数型言語プログラミング の原書の Real World Haskell 曰く:

独習 Scalaz: 9日目

in

更新された html5版があるので、よろしくお願いします。

8日目は、モナディック関数の joinfilterM、と foldLeftM をみて、安全な RPN 電卓を実装して、Kleisli を使ってモナディック関数を合成する方法をみた後で、独自のモナド Prob を実装した。

Tree

Learn You a Haskell for Great Good の最終章 Zippers を始めよう:

In this chapter, we'll see how we can take some data structure and focus on a part of it in a way that makes changing its elements easy and walking around it efficient.

独習 Scalaz: 8日目

in

更新された html5版があるので、よろしくお願いします。

7日目は、Applicative Builder をみて、あと State モナド、\/ モナド、Validation もみた。

便利なモナディック関数

Learn You a Haskell for Great Good 曰く:

In this section, we're going to explore a few functions that either operate on monadic values or return monadic values as their results (or both!). Such functions are usually referred to as monadic functions.

独習 Scalaz: 7日目

in

更新された html5版があるので、よろしくお願いします。

6日目は、for 構文をみて、Writer モナドと関数をモナドとして扱うリーダーモナドをみた。

Applicative Builder

実はリーダーモナドの話をしながらこっそり Applicative builder |@| を使った。2日目 に 7.0.0-M3 から新しく導入された ^(f1, f2) {...} スタイルを紹介したけど、関数などの 2つの型パラメータを取る型コンストラクタでうまく動作しないみたいことが分かった。

Scalaz のメーリングリストを見ると |@| は deprecate 状態から復活するらしいので、これからはこのスタイルを使おう:

scala> (3.some |@| 5.some) {_ + _}
res18: Option[Int] = Some(8)

独習 Scalaz: 6日目

in

更新された html5版があるので、よろしくお願いします。

昨日は、flatMap を導入する Monad 型クラスをみた。また、モナディックなチェインが値にコンテキストを与えることも確認した。OptionList も標準ライブラリに flatMap があるから、新しいコードというよりは今まであったものに対して視点を変えて見るという感じになった。あと、モナディックな演算をチェインする方法としての for 構文も確認した。

for 構文、再び

Haskell の do 記法と Scala の for 構文には微妙な違いがある。以下が do 表記の例:

foo = do
  x <- Just 3
  y <- Just "!"
  Just (show x ++ y)

独習 Scalaz: 5日目

in

更新された html5版があるので、よろしくお願いします。

4日目は Functor則などのモナドの規則をみて、ScalaCheck を用いて任意の型クラスの例を使って検証した。また、OptionMonoid として扱う3つの方法や foldMap などを行う Foldable もみた。

モナドがいっぱい

今日は Learn You a Haskell for Great Good の新しい章を始めることができる。

独習 Scalaz: 4日目

in

更新された html5版があるので、よろしくお願いします。

昨日は、カインドと型について考え、Tagged type を探検して、さまざまな型の 2項演算を抽象化する方法としての SemigroupMonoid をみてみた。

いくつかの感想や意見もいただいた。まず、kind 計算機だけど paulp さんから Option.type みたいにコンパニオン型を使ったらどうかと教えてもらった。更新したバージョンを使うとこう書ける:

scala> kind[Functor.type]
res1: String = Functor's kind is (* -> *) -> *. This is a type constructor that takes type constructor(s): a higher-kinded type.

Jason Zaugg さんにもコメントをもらった:

独習 Scalaz: 3日目

in

更新された html5版があるので、よろしくお願いします。

昨日map 演算子を加える Functor から始めて、Pointed[F].point や Applicative な ^(f1, f2) {_ :: _} 構文を使った多態的な関数 sequenceA にたどり着いた。

型を司るもの、カインド

Making Our Own Types and Typeclasses の節で昨日のうちにカバーしておくべきだったけどしなかったのはカインドと型の話だ。Scalaz の理解には関係無いだろうと思ってたけど、関係あるので、座って聞いて欲しい。

すごいHaskellたのしく学ぼう の原書 Learn You a Haskell For Great Good 曰く:

Syndicate content