Skip to content

Instantly share code, notes, and snippets.

@314maro
314maro / cps.hs
Last active August 29, 2015 13:56
継続?
{-# LANGUAGE RankNTypes, MonadComprehensions, FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative
import Data.String
a :: ListC Char
a = "Hello," `appc` " " `appc` "world!"
b :: Maybe' (Char, ListS Char)
@314maro
314maro / Readme.md
Last active August 29, 2015 13:56
プログラミング言語のようなゴミ

普通にどうでもいいような言語作ろうとしたら型なしラムダ計算に余計なもの足しただけみたいになってしまった。 再帰も単純にはできない。

Data 宣言はただの代入の糖衣構文です。 例えば Data just _ | nothing は just = (\x c1 c2 -> c1 x); nothing = (\c1 c2 -> c2) を意味します。 just, _, nothing は任意の識別子です。 _の部分は名前であれば意味は変わりません。 Data の直後に | があってもなくても構いません。

@314maro
314maro / monad.hs
Last active August 29, 2015 13:56
モナドは単なるなんとやら
{-# LANGUAGE TypeOperators #-}
-- a
class Monoid' m where
-- 非カリー化
append :: (m, m) -> m
-- m と () -> m は同一視できる
empty :: () -> m
-- 型 ((), m) と m と (m, ()) は同一視できる
-- 型 ((l, m), n) と (l, (m, n)) は同一視できる
@314maro
314maro / †.hs
Created March 2, 2014 13:05
†を()に
import Data.List
parens 0 = [""]
parens n = [ x ++ y
| a <- [0..n-2]
, let b = n-2-a
, x <- map ('(':) (parens a)
, y <- map (')':) (parens b)
]
@314maro
314maro / sushi.hs
Last active August 29, 2015 13:57
🍣
(🍣) (🐭) (🐮) (🐯) = (🐯) 🐭 ((🐮) (🐯))
(🐳) (🐭) (🐮) = (🐭)
(🐗) = (🐳)🍣(🐳)
(🐣) = (🐳)(🍣)🍣(🐳)
(🐥) = ((🐣)🐣(🍣))🍣((🐳)(🐳))
(💪) = (🐥)(🐗)
(🐸) 0 = (🐳)(🐗)
(🐸) (🐭) = (🐣)🍣((🐸)((🐭)-1))
### ラムダ
🐫 変数👉 式
### 括弧
🌜 式🌛
### コメント
🌝 コメ🌝 ネストできる🌞 ント🌞
### 例
🐫 🐭 👉 🐫 🐮 👉 🐫 🐯 👉 🐭 🐯 🌜 🐮 🐯 🌛 🌝 Sコンビネータ🌞
### バグ
変数まわりにバグがある
@314maro
314maro / monoid.hs
Created March 19, 2014 07:21
ApplicativeでMonoidをくるむとMonoid 最大値や最小値とMonoid
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
import Data.Monoid
import Control.Applicative
newtype AppMon f m = AppMon { getAppMon :: f m }
deriving (Functor, Applicative)
instance (Applicative f, Monoid m) => Monoid (AppMon f m) where
mempty = pure mempty
mappend = liftA2 mappend
@314maro
314maro / language.c
Created March 23, 2014 13:03
クソコードかきました
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
// TODO: 値を返すところで NULL のかわりをしたい
typedef long long int_val;
@314maro
314maro / monoid.hs
Created March 24, 2014 16:16
スタンピングモナド
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FlexibleContexts #-}
{-# LANGUAGE FunctionalDependencies, ScopedTypeVariables #-}
import Data.Void
import Data.Bifunctor
import Control.Comonad
import qualified Data.Monoid as M
-- i -> f はよくないかもしれない
class Bifunctor f => Monoidal i f | i -> f, f -> i where
midL1 :: a -> f i a
@314maro
314maro / shunting_yard.c
Created April 4, 2014 03:39
操車場アルゴリズム
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
enum oper { lparens, add, sub, mul, div_op };
int pri(enum oper op) {
switch (op) {
case lparens:
return 0;