Haskell
自分でもよく飽きないなーと思いますが、またしてもゆのネタです。私のアタマではどう頑張っても正式なゆの式を書くことができなかったので、AAに関しては激しく妥協しつつ、別方向で変態的なコードを作ろうとしてみました。その結果が以下です。 import Pre…
_ が変数として使えないので、パターンマッチの文脈で無理やり使ってみたら、なんだか微妙な表情になってしまいました。私には X が目で / と | は口元のシワにしか見えません。 import Prelude hiding ((<),(/)) import System.IO.Unsafe import qualifed S…
http://d.hatena.ne.jp/ranha/20080709/1215658800まぁ少なくとも片方は #define 使う必要ないですよね。 #define _ X import Prelude hiding((<),(/)) data X = X a / b = X a < b = putStrLn $ "Hidamari Sketch 365 " ++ b main = X / _ / X < "Please se…
たとえばある関数 f が単調増加することが分かっている場合、 sum [ a | x <- [1..], let a = f x, a < m ] みたいに書いて、m 未満の f(x) の和を計算したいのです。もちろんこのコードは止まりません。処理系は関数が単調増加だなんて知る由もないのですか…
Haskell は負数の割り算をきちんとサポートしていて、剰余の符号が、割る数と割られる数のどっちに依存するかで2種類ある。 quotRem x y = (q,r) ならば x = qy + r divMod x y = (d,m) ならば x = dy + m 違いは、r の符号は x と同じ (restoring method) m…
数論入門―証明を理解しながら学べる (ブルーバックス) を見て、加速互除法というユークリッドの互助法の高速化ネタを知りました。 剰余を絶対値が最小になる取り方で与えると、パラメータの減りが速くなるとのこと。 なるほどーと思って実装してみたのですが…
(reverse . sort) 的なことをしたい時は rSort :: (Ord a) => [a] -> [a] rSort = sortBy (flip compare) でいいんだろか。compare関数はPerl/Rubyでいう 一般化を考える sortBy (flip compare) が sortBy compare の逆順となるように、 一般に sortBy f の…
mapするとリストの長さが変わるという、大変愉快な事態に遭遇しました。 Prelude> length $ [0,10..35] 4 Prelude> length $ map (/ 5) [0,10..35] 5なんじゃこりゃーと思っていろいろ試してみる。 Prelude> [0,10..35] [0,10,20,30] Prelude> [0,10..35] ::…
Problem 169 をやってた時の話。HaskellのArrayって、よく知らんけど多分なんか複雑な木構造だと思うんですが、単純に連続したメモリ領域なんか確保しないんだろうし、思い切ってインデックスの範囲を ( (0,0), (10^25,84) ) くらい取ってDPしたら Negative …
気づいたら既に一週間経ってしまって、自分でもこれはひどいなーという感じです。 風邪で寝込んだり確定申告とかでドタバタしてました。ブログぐらいタイムリーに書きたいものです。 以下、思い出し思い出し… 3/1 大阪会場にて参加。OCamlでやってました。今…
どう書く?org - ピラミッドを作る 初めて uncurry が欲しくなる場面に会った。 こんな風にデータがtupleとして固着しているときには、データの方をバラすんではなく、関数の方を uncurry してしまう方がすっきりする。 pyramid :: Int -> String pyramid n …
定義をド忘れしてた。 foldl :: (a -> b -> a) -> a -> [b] -> a foldl f z [x1, x2, ..., xn] == f (.. (f (f z x1) x2)..) xn == (..((z `f` x1) `f` x2)..) `f` xn foldr :: (a -> b -> b) -> b -> [a] -> b foldr f z [x1, x2, ..., xn] == f x1 (f x2 .…
モナドのすべてとりあえず第一部を読んだ。最後の節、「Haskell におけるモナドのサポート」がなかなか重い。 メモ。 do記法はあらゆるモナドに適用できる。 でもあくまで、モナド計算を命令型っぽく書くための syntax sugarである。 doの中でパターンマッチ…
>>= を、(>>= f) という、右辺を部分適用させたセクション単位で考えると見やすいかもしれない。 f :: a -> m b ならば (>>= f) :: m a -> m b >>= を、上のように、「(a -> m b) な関数に被せて (m a -> m b) という関数を作る仕組み」だと考えるんである。…
import [qualified] モジュール名 [(インポートリスト)| hiding (ハイディングリスト)] [as エイリアス] 明示的にPreludeのimport宣言をしない場合は、暗黙的に「import Prelude」が宣言される インポートしたエンティティは、import宣言を書いたモジュール…
module モジュール名 [(エクスポートリスト)] where -- []内はoptional 他のモジュールにインポートできるようにする module宣言を省略すると、「module Main (main) where」が補われる。 エクスポートリストを省略すると、すべてのエンティティがエクスポー…
エンティティの名前空間がモジュールごとに分かれている エンティティ 変数 型コンストラクタ データコンストラクタ フィールドラベル 型クラス クラスメソッド
Haskell Hierarchical Libraries
まだ完全には消化できていないので、とりあえず思ったことだけつらつらと。 モナドの前に、まずは型クラスをちゃんと理解しよう EqとかOrdみたいな単純なものは、それ自体がデータとしての意味をもつ型を対象にした型クラスだけれど、Monadは「型パラメータ…
Eq : 同値関係が定義できる Ord : 順序関係が定義できる Show : 文字列に変換できる Read : 文字列から変換できる Num : 数値型 Integral : 整数型 Numのサブクラス Fractional : 小数型 Numのサブクラス
Java等のクラスとは違い、特定の型コンストラクタの集合を定義する。 多相型に制約をつけるためのもの アドホック多相: 制約のついた多相性 パラメータ多相: 制約の無い多相性 クラスメソッド 型クラスを特徴付ける関数 ある型クラスに属する型は、その型ク…
data宣言 新しい型を定義する data 型コンストラクタ 型変数1 型変数2 ... = データコンストラクタA 型A1 型A2 ... | データコンストラクタB 型B1 型B2 ... | データコンストラクタC 型C1 型C2 ... : 型コンストラクタとデータコンストラクタの名前空間は別…
型 = 値の集合 型推論 「::」構文による型宣言 多相型: 型変数を含む型
関数合成や部分適用を使って、関数を関数で定義するコーディングスタイル 変数が減るのでコードが読みやすくなる 型宣言や関数名をしっかり書かないとわけわからなくなる
たとえば、f :: Int -> Int -> Int だとすると、 (f 5) :: Int -> Int 二項演算の場合 セクションと呼ぶ 第二引数(右辺)を渡して第一引数をパラメータ化することもできる。 `` を使えば任意の二項演算に対してこれが使える。 increment n = (+ 1) n -- 「n…
(.) :: (b -> c) -> (a -> b) -> (a -> c) (f . g) x ≡ f (g x) f . g . h ≡ f . (g . h) -- 右結合
ラムダとして、バックスラッシュ(\)を使う 引数にパターンマッチが使えるが、2つ以上のパターンを順番に試すことはできない {- Haskell -} \x (y:ys) -> x * y (* OCaml *) (* 複数パターンは使えないが複数引数が可能 *) fun x y -> x * y (* 複数引数は使…
引数や返り値に関数をとる関数
識別子 1文字目 [a-z_] 2文字目以降 [a-zA-Z0-9_']* 予約語 case , class , data , default , deriving , do else , if , import , in , infix , infixl , infixr , instance let , module , newtype , of , then , type , where , _ 中項演算子 二項関数 → …
関数定義の一般形 関数名 パターンA1 パターンA2 ... | ガードA1 = 定義A1 | ガードA2 = 定義A2 | ガードA3 = 定義A3 : 関数名 パターンB1 パターンB2 ... | ガードB1 = 定義B1 | ガードB2 = 定義B2 | ガードB3 = 定義B3 : : :一つの関数は複数の引数を持ち…