言語拡張は以下の2点。
- クラスにoperator doを定義できるようにする
do 型名 { 変数宣言 <- 値; 値; ...}
という構文の新設
使用イメージは以下のような感じ。
// モナドの型
template <typename T> class MyMonad {
MyMonad(const T& t) {...} // Haskellのpure(return)に相当
use std::fmt; | |
const N_VALS : usize = 4; | |
type KeyT = i64; | |
enum BTreeNode<T> | |
{ | |
Nil, | |
Node |
{-# 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 |
言語拡張は以下の2点。
do 型名 { 変数宣言 <- 値; 値; ...}
という構文の新設使用イメージは以下のような感じ。
// モナドの型
template <typename T> class MyMonad {
MyMonad(const T& 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 |
{-# 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 |
{-# 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 | |
-- 書いてしまいがちなクソコード |
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, ()) |
-- 与えるもの:あるレコード型とその上のLens | |
data Hoge = Hoge { _hoge1 :: ..., _hoge2 :: ..., ... } | |
makeLenses ''Hoge -- hoge1, hoge2, ...が定義される | |
-- ↓ ここからTemplate Haskellで生成するか、あるいは... | |
-- 欲しいもの1:直和型とその上のPrism | |
data CoHoge = CoHoge1 ... | CoHoge2 ... | |
makePrisms ''CoHoge -- _CoHoge1, _CoHoge2, ...が定義される | |
-- CoHogeのコンストラクタはなくてもいい。型とPrismが必要 |