先週のekmett勉強会でliyanghuさんが紹介して下さったprofunctorがちょっと興味深いので、まだ完全に飲み込めては居ないのですが、簡単に纏めてしまおうと思います。さて、我々にとってFunctorと言えば「fmap :: (a -> b) -> f a -> f b」というメソッドを持…
例えば、xを2倍してshowする関数fを考えます。 素直に書けば次のようになるでしょう。 Prelude> let f x = show (x * 2) Prelude> f 5 "10"こういったシンプルな処理は、ポイントフリースタイルにするのがHaskellらしいプログラミングですね。 Prelude> let…
Arrowの基本、三本目の記事は、Arrowが関数を繋いでいく流れの中で条件分岐を作り出す ||| 演算子の再実装をしていきます。 Prelude Control.Arrow> :i (|||) class (Arrow a) => ArrowChoice a where ... (|||) :: a b d -> a c d -> a (Either b c) d -- D…
前回からの変更点: 実際の実装に合わせて、各MyArrowクラスから関数を取り出す関数は MyArrow型クラスに定義したrunArrでは無く、各型定義のアクセサ関数を使うようにします。 module Main where --Arrow型クラス class MyArrow a where myarr :: (b -> c) …
深い意味は無いです、そういえば書いたこと無かったなぁと思ったので・・・ module Main where fizzbuzz :: Integer -> String fizzbuzz x | x `mod` 15==0 = "FizzBuzz" | x `mod` 3==0 = "Fizz" | x `mod` 5==0 = "Buzz" | otherwise = show x main :: IO …
リストを引数として受け取り、head関数を適用した後Foo型構成子に放りこんで返すheadFoo関数を考えます。 module Main where data Foo a = Foo a deriving Show headFoo a = Foo (head a)ここで、データ構成子Fooは「a -> Foo a」という関数と見なせるので、…
前回のエントリのテープに対する処理を、モナドに包んだだけです。 module Machine(TapeValue(..)) where --テープの値は 0 または 1 data TapeValue = T0 | T1 deriving Eq instance Show TapeValue where show T0 = "0" show T1 = "1" --無限長の長さを持…
そもそも、今日はderivingについて書こうと思っていたのですが、その前に型を作る段階で一つ記事が書けるレベルの内容だったので、まずはちょっとした型を定義してみる事にします。 module Main where --型 Bar を作成 newtype Bar = Bar Int deriving (Eq,R…
まずはじめに、HaskellでのHelloWorld。 module Main where main :: IO () main = print "Hello,World!"この"()"というのが気になったのですが、どうやらちゃんとPrelude(?)で定義されているようです。 Prelude> :i () data () = () -- Defined in GHC.Un…