##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 |