言語拡張は以下の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が必要 |