Skip to content

Instantly share code, notes, and snippets.

@as-capabl
as-capabl / main.rs
Created May 24, 2020 05:12
Rust習作 B木
use std::fmt;
const N_VALS : usize = 4;
type KeyT = i64;
enum BTreeNode<T>
{
Nil,
Node
@as-capabl
as-capabl / ArrowApplyMealy.hs
Created March 8, 2020 15:32
MealyのArrowApply law 検証
{-# LANGUAGE BangPatterns, Arrows #-}
module Main where
import Prelude hiding (id, (.))
import Control.Category
import Control.Arrow
import Control.Monad.Identity
import qualified Data.Machine as Mc
import Data.Machine ((~>))
import Data.Machine.Mealy
@as-capabl
as-capabl / oreore_monad.md
Created May 10, 2019 03:57
妄想C++言語拡張 - オーバーロード可能セミコロンとしてのモナド

言語拡張は以下の2点。

  • クラスにoperator doを定義できるようにする
  • do 型名 { 変数宣言 <- 値; 値; ...} という構文の新設

使用イメージは以下のような感じ。

// モナドの型
template <typename T> class MyMonad {
 MyMonad(const T&amp; t) {...} // Haskellのpure(return)に相当
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TupleSections #-}
module SLang where
import Control.Monad.State
import Data.Bool
import Data.Maybe
import Control.Monad.Trans.Iter
import Control.Monad.Identity
@as-capabl
as-capabl / kequiv.hs
Created July 11, 2018 03:42
Path inductionで型レベル同値関係から値レベル同値関係を導く
{-# LANGUAGE PolyKinds, DataKinds, TypeFamilies, TypeOperators, FlexibleInstances, MultiParamTypeClasses #-}
{-# LANGUAGE AllowAmbiguousTypes, ScopedTypeVariables, TypeApplications, TypeInType, GADTs, RankNTypes #-}
import GHC.Types
import Data.Type.Equality
import Unsafe.Coerce
-- 仮定:Path Induction
indEquiv ::
forall k (t :: forall (x :: k) (y :: k). (x :~: y) -> Type).
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ConstraintKinds #-}
module Main where
@as-capabl
as-capabl / upgrade.hs
Created August 25, 2017 08:58
extensible-effectsの作用の拡大
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
import Control.Eff
import Control.Monad.Free.Reflection
import Data.OpenUnion
import Data.Typeable
-- http://aiya000.github.io/posts/2017-08-22-my-experience-of-eff-convertion.html
{-# LANGUAGE BangPatterns #-}
import Data.List (foldl')
-- お題:リスト中の偶数を全部足す
-- 最高
sumEven1 :: [Int] -> Int
sumEven1 = foldl' (+) 0 . filter even
-- 書いてしまいがちなクソコード
@as-capabl
as-capabl / builder.hs
Created May 10, 2017 03:10
Writerっぽくリスト作れて、遅延評価とかfoldr/buildとか効くヤツ
module Main where
import Control.Monad.Free.Church
import GHC.Exts (build)
import Control.Monad (forever)
type Builder b = F ((,) b)
putB :: b -> Builder b ()
putB x = liftF (x, ())
@as-capabl
as-capabl / lens-prism.hs
Created February 21, 2017 08:59
LensとPrismで解きたい問題
-- 与えるもの:あるレコード型とその上のLens
data Hoge = Hoge { _hoge1 :: ..., _hoge2 :: ..., ... }
makeLenses ''Hoge -- hoge1, hoge2, ...が定義される
-- ↓ ここからTemplate Haskellで生成するか、あるいは...
-- 欲しいもの1:直和型とその上のPrism
data CoHoge = CoHoge1 ... | CoHoge2 ...
makePrisms ''CoHoge -- _CoHoge1, _CoHoge2, ...が定義される
-- CoHogeのコンストラクタはなくてもいい。型とPrismが必要