自分のhaskellツイートまとめ

去年の年末から少しHaskellの本などを読んでつぶやいていたのをまとめてみた。

1月20日

@shin16s 日曜日にひさしぶりにHaskellの続きやりはじめて、ちょっとつぶやいて、飯行くって中断して、気がついたら木曜日って、どういうこと?

ということで、日曜の続き。 data Maybe a = Nothing | Just a deriving (Eq, Ord) Maybe a型の値はNothingかJust xのどちらか。 ここで、lookupという関数がある

このlookup関数は2要素タプルのリストalistからキーが第一要素に一致する最初のタプルの第二要素をMaybeにいれて返す。 lookup :: (Eq a) => a -> [(a, b)] -> Maybe b

型宣言 lookup :: (Eq a) => a -> [(a, b)] -> Maybe b 凡例 lookup key alist あれ?この(Eq a) => aってなんだっけ?(Eq a)型の引数をとってa型の値を返す関数だっけ?だとするとkeyは関数になっちゃう?

違う。スーパークラスの指定だ。Eqがスーパークラス“@shin16s: 型宣言 lookup :: (Eq a) => a -> [(a, b)] -> Maybe b 凡例 lookup key alist あれ?この(Eq a) => aってなんだっけ?(Eq a)型の引…

1月16日

Maybeモナドのお勉強。ふつけるの11.2でMaybeについての説明がある。Maybrはdata宣言で次のように定義されている。 data Maybe a = Nothing | Just a deriving (Eq, Ord)

@shin16s ひさしぶりで忘れてる。data宣言ってなんだっけ?

@shin16s data宣言は新しい型を作るために使う。 data Anchor = A String String Anchorは型コンストラクタ AはAnchor型のデータコンストラクタ String Stringはフィールドの数と型をあらわす

1月14日

型クラスあたりとモナドが使えるようになれば、Haskellの勉強を始めた意味があるように思える

1月1日

ふつうのHaskellプログラミングの第9章 型と型クラスを読んでる(二回目)なんだけど、やっぱりあんまり理解できてない。そもそも用語がごっちゃになってる。この章読みおわったら、用語まとめてみる

@shin16s length関数の型> length :: [a] -> Int このaを型変数という([a]は任意の型aのリストをあわらす) 型変数を含む型を多相型という 型変数が2つでてくる例> zip :: [a] -> [b] -> [(a, b)] ここまではOK

@shin16s HTMLのaエレメントを表現する型、Anchor型の定義> data Anchor = A String String ここでは「Anchor」が新しい型の名前(『型コンストラクタ』)。「A」はAnchor型の『データコンストラクタ』。

@shin16s データコンストラクタは関連付けられた型の値を作成する。ここではAnchor型の値を作成している。 「String String」はフィールドが二つあり、それらは両方共String型であることを表している。

@shin16s 用語『型コンストラクタ』と『データコンストラクタ』、あとでこのへんごちゃごちゃになる気がするが、今のところOK

@shin16s data宣言で宣言した型のフィールドにアクセスするには、データコンストラクタを使ったパターンマッチを利用する。例> compileAnchor (A url label) = ...

@shin16s このように書くとAnchor型の値について、一つ目のフィールドの値に変数urlを束縛し、二つ目のフィールドの値に変数labelを束縛する。

@shin16s ちょっと待て、『型』の『フィールド』へのアクセス?なんか微妙にわからん感じがするので整理する

@shin16s この> compileAnchor (A url label) = ... というのは関数compileAnchorの定義だよね。その引数としてAnchor型の値を取るってことでOK?

@shin16s そうすると実際に適用するときは> compileAnchor A みたいになる? ちがうか、「A」は「データコンストラクタ」であって、「A」が「Anchor型の値」ってわけじゃないか

@shin16s > (A url label) のようにデータコンストラクタAによって作成された > A "http://hoge.net/" "HOGE!" のようなものが「Anchor型の値」か。

@shin16s だから> compileAnchor A "http://hoge.net/" "HOGE!" みたいになるのかな?

@shin16s なんか今まで『データコンストラクタ』と『データコンストラクタが作る値』がごっちゃになっていた気がする。

@shin16s フィールドラベルやセレクタはとくに問題ない(と思う

@shin16s 多相的な型の宣言> data Stack a = MkStack [a] 『Stack』が型コンストラクタ、『Stack a』が型名。これまでの例では型変数を使っていなかったので型コンストラクタと型名が一致していただけ。え!?そうなの?これ、混乱の元だと思うけど

12月16日

えと、部分適用のはなし。「Haskellでは関数にすべての引数を同時に渡さなくても構わない」ってスゲくね?ほんで、2引数の関数に1個だけ引数渡して(部分適用)おくと1引数の関数になっちゃう

まじめな話再開。二項演算子に部分適用を使い引数をひとつだけ渡したものをセクションという。たとえば(+ 1)は(n + 1)のnを渡していない関数

で、部分適用と高階関数を組み合わせると map (+ 7) lis みたいな感じで、lisの各要素に7足したリストを得られる

12月15日

今日は関数のところから

Haskellの無名関数は \num -> num * num こんな感じ

\をラムダと読ませるらしい。無理があるにも程がある

まあRubyではラムダは->だったような気がするので、似たようなものか

そういえば関係ないけど、pythonのジェネレータのところを読んで、yieldを理解した気がするけど、もう忘れた

haskellの無名関数の話の続きだけど、\の次のnumが引数のパターン

  • > のあとの式が関数本体

\x y -> x + y で二つの引数を足し合わせる無名関数

高階関数と組み合わせるとmap (\n -> n * n) lisみたいな感じ

みんな大好きなmap

ちなみにさっきのをperlだと map {$_ * $_} @lis; rubypythonでも似たようなもの。 phpだと array_map(create_function('$a', 'return $a * $a;'), $lis); どうしてこうなった。。

Haskellの話に戻って、次は関数合成。このへんの話を読むと数学っぽいなと思う

.で関数を合成する c = a . b みたいな

(.) :: (b -> c) -> (a -> b) -> (a -> c)

ちなみに(.)も関数。二つの関数を合成する関数

(f . g) x と (f (g x)) ha

は等価

12月14日

ビール飲んでるけど、はしゅけるのお勉強する

アヒル口とか馬鹿じゃねーの

あ、Haskellの話です。嘘です

Haskellで文字列はリスト=>Haskellはリスト操作がかなり得意=>Haskellは文字列操作が得意=>Haskellはウェブアプリ作るのに向いてる。ということで、なんでHaskellが未だphpを駆逐していないのか意味が分からない。嘘です

正規表現とか目じゃねーし。嘘です。よくわかってません

パターンマッチの所を読む

    • map関数の定義 map :: (a -> b) -> [a] -> [b] map f = map f (x:xs) f x : map f xs

上から順にマッチするか試していく

(x:xs)はリストでxは第一要素、xsは第二要素以降のリスト。Lispっぽい?というか関数型言語ってこういうものなの?

あ、さっきのmap f (x:xs) = f x : map f xsの間違い。=を忘れた。ちなみに=で(ここでは)関数が定義されてて、mapは再帰で定義されている

パターンマッチには7種類あるらしい。変数パターン、_パターン(ワイルドカード)、リテラルパターン、タプルパターン、リストパターン、データコンストラクタパターン、n + kパターン

Haskellでパターンマッチって関数の引数に使うものなのか?それ以外で使うときはcase式で使う?

12月13日

haskellは関数を展開してから引数を簡約する。これが遅延評価に関係してるのか

ちなみにこの関数を展開してから引数を簡約するのを最外簡約というらしい

関数を展開してから引数を簡約する=>遅延評価になる。なるほどって思った

あと、評価に必要のない式は評価されない。ってのもなるほど

12月10日

ふつうのHaskellを一通り読んだけど、型クラスあたりから難しくなってきて、パーサ作るあたりはほとんど飛ばし読みした

12月9日

Haskellってparser書くための言語なの?っていうか言語書くための言語なの?

Haskellのparsecについての章を読んだんだけどね。

慣れればPerlのパーサが15分でかけるようになるって、誰かが書いてた

@shin16s これか http://kzk9.net/column/haskell_parsec.html

11月30日

型と型クラスの代数的データ型辺りからややこしくなってきた

Haskellには型クラスというものがある。型に対するクラス。型クラス以外のクラスはないのかな?継承もクラスメソッドもクラスメソッドのオーバーロードもある。なんかHaskellって型に対してプログラミングしてるような感じがある

11月29日

関数合成とかみると数学っぽいなって思う

Haskell(というか関数型言語)では、引数のない関数は存在しない、ということなのか?わかるようなわからんような

ふつうのHaskell中。まだ型コンストラクタとデータコンストラクタがごっちゃになる

11月28日

Haskellでは例えばInt型の引数を2つとりInt型の値を返すようなの関数の型定義はInt -> Int -> Intって書くらしいんだけど、この書き方なんかへんじゃね?って、思ってた。普通、例えば、(Int, Int) -> Intとかなりそうじゃない?

@shin16s でも、部分適用のところを読んだら納得した。Haskellでは二引数の関数に一つだけ引数を渡した式は「二引数の関数に一つだけ引数を渡した関数」になるらしい。だからInt -> Int -> IntはInt -> (Int -> Int)となる

@shin16s Haskellでは真の意味で2つ以上の引数を取る関数はない、とのこと。