Skip to content

Instantly share code, notes, and snippets.

View lotz84's full-sized avatar

Tatsuya Hirose lotz84

View GitHub Profile
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]
@lotz84
lotz84 / shift-reset-2.7.hs
Last active August 29, 2015 14:20
Reading "shift/reset プログラミング入門"
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)
@lotz84
lotz84 / unitx.md
Last active August 29, 2015 14:23

#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
@lotz84
lotz84 / gist:26ce3f3d29342876ceda
Created July 21, 2015 03:27
web page 内のリンク先URLを列挙する
{-# 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