##1. Introduction ###About this tutorial 想定読者は手続き型言語(C, C++, Java, Python …)を経験しているが関数型言語(Haskell, ML, OCaml …)を経験していない人.
###So what's Haskell? Haskellは
- 純粋関数型言語
- 評価戦略は遅延評価
- 型推論のある静的型付け言語
import Data.List | |
type Vertex = Int | |
type Edge = (Vertex, Vertex) | |
getEdges :: IO [Edge] | |
getEdges = do | |
putStr "> " | |
line <- getLine | |
if line == "" |
{-# LANGUAGE RankNTypes #-} | |
data Proc a = Action1 a | Action2 a | Action3 a | |
newtype Yoneda f a = Yoneda { runYoneda :: forall b. ((a -> b) -> f b) } | |
instance Functor (Yoneda f) where | |
fmap f m = Yoneda (\k -> runYoneda m (k . f)) | |
data Free f a = Pure a | Free (f (Free f a)) |
レンズは余状態余モナドの余代数だった | |
=================================== | |
余余余〜!別名`関数的参照`とも呼ばれる[レンズ](https://hackage.haskell.org/package/lens)はJavaのGetter, Setterと同等と[言われる](https://twitter.com/plt_borat/status/228009057670291456)関数型プログラミングのデザインパターンの一つです。 | |
レンズは余状態余モナドの余代数だと[聞いて](https://twitter.com/hiratara/status/317602743219003392)そうなのかーと思ってたのですが、ふと自分で実装してみたくなったので **余状態余モナドの余代数** として実装してみることにしました。 | |
ちなみにこの文章は`literate Haskell`という形式で書かれているのでダウンロードしてghciでロードすればすぐにでも自分で試すことができます。 | |
まず最初におまじない | |
> {-# LANGUAGE RankNTypes #-} |
{-# LANGUAGE RankNTypes #-} | |
{-# LANGUAGE ExistentialQuantification #-} | |
data ShowBox = forall s. Show s => SB s | |
instance Show ShowBox where | |
show (SB s) = show s | |
heteroList :: [ShowBox] | |
heteroList = [SB (), SB 5, SB True] |
import Control.Monad.Cont | |
data Tree = Empty | |
| Node Tree Int Tree | |
data Result = Done | |
| Next Int (() -> Cont Result Result) | |
yield :: Int -> Cont Result () | |
yield n = shiftT $ \k -> return (Next n k) |
##1. Introduction ###About this tutorial 想定読者は手続き型言語(C, C++, Java, Python …)を経験しているが関数型言語(Haskell, ML, OCaml …)を経験していない人.
###So what's Haskell? Haskellは
{-# LANGUAGE DeriveGeneric, TemplateHaskell #-} | |
import GHC.Generics | |
import Control.Lens | |
data Score = Score | |
{ _english :: Int | |
, _math :: Int | |
} deriving (Generic, Show) |
#UniRX FRPのUnity実装
Haddock のようなものはないのでコードを直接読むのがいい
##Example
import Data.IORef | |
data Scene = Scene { keyboardHandler :: Char -> IO () | |
, stepHandler :: IO () | |
, drawHandler :: IO () | |
} | |
mkTitle :: IORef Scene -> IO Scene | |
mkTitle transit = do | |
x <- newIORef 0 |
{-# LANGUAGE OverloadedStrings #-} | |
import Control.Lens | |
import Data.Foldable | |
import Network.Wreq | |
import Text.Taggy.Lens | |
import Data.Text.Lazy.Encoding | |
import Data.Maybe | |
main = do |