Skip to content

Instantly share code, notes, and snippets.

@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 DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ConstraintKinds #-}
module Main where
@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 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 / 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)に相当
@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 / 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