Skip to content

Instantly share code, notes, and snippets.

@matsu-chara
matsu-chara / adt.hs
Created April 30, 2015 11:34
http://nebuta.hatenablog.com/entry/2013/07/28/062609] AgdaやってたらGADTなるものが出て、 一般化ADTってなんやとなったので写経
data Exp r = Const r | Add (Exp r) (Exp r) | Subtract (Exp r) (Exp r)
eval :: (Num r) => Exp r -> r
eval (Const v) = v
eval (Add e1 e2) = eval e1 + eval e2
eval (Subtract e1 e2) = eval e1 - eval e2
reify:: (Show r) => Exp r -> String
reify (Const v) = show v
reify (Add e1 e2) = concat ["(", reify e1, " + ", reify e2, ")"]
.class public Calculator
.super java/lang/Object
.method public <init>()V
aload_0
invokespecial java/lang/Object/<init>()V
return
.end method
.method public add(II)I
@matsu-chara
matsu-chara / test.scala
Created May 20, 2015 02:13
動かない(´・_・`)
import shapeless._
import HList._
object TestEquiv {
case class Example[A, B](a: A, b: Seq[B], c: Int)
trait Equiv[T] {
def equiv(a: T, b: T): Boolean
}
@matsu-chara
matsu-chara / takeWhile.scala
Last active August 29, 2015 14:21
foldLeftを使ったtakeWhile
def takeWhile[T](l: List[T])(p: T => Boolean) = {
class AccException(val acc: List[T]) extends RuntimeException {}
try {
l.foldLeft(List.empty[T]) { (acc, x) =>
if(p(x)) {
println(x)
x :: acc
}
else throw new AccException(acc)
}
@matsu-chara
matsu-chara / Eq.scala
Created May 22, 2015 01:10
Eqインスタンスの導出
import shapeless._
import HList._
object TestEquiv {
case class Example[A, B](a: A, b: Seq[B], c: Int)
trait Equiv[T] {
def equiv(a: T, b: T): Boolean
}
@matsu-chara
matsu-chara / NatCompare.scala
Last active August 29, 2015 14:21
implicitパラメータを取るimplicit defの読み方
// 自然数の比較
import Nat._
// expression of A < B
trait LT[A <: Nat, B <: Nat]
object LT {
type <[A <: Nat, B <: Nat] = LT[A, B]
@matsu-chara
matsu-chara / HListCompare.scala
Last active August 29, 2015 14:21
implicitパラメータを取るimplicit defの読み方(もうちょい複雑な例)
// Natで構成されたHListから、あるA以下の値でできたHListを抽出
import LT._
import LTEq._
import HListImpl._
/**
* HとAを受け取る。 フィルターされたA以下の型はOutに入る
* @tparam H フィルターの対象となるHList
* @tparam A フィルター基準値
import Control.Monad
-- list
:{
do
x <- [1,2,3] `mplus` [4,5,6]
return x -- [1, 2, 3, 4, 5, 6]
:}
:{
@matsu-chara
matsu-chara / DerivingTest.scala
Last active February 2, 2024 01:24
case classをtupleに変換したり、tupleをcase classに変換できるIso trait
package Deriving
// (だいたい)任意のcase classをマクロでtupleに変換
object DerivingTest extends App {
// テスト用ケースクラス
case class Bar()
case class Foo(i: Int, s: String, d: Double)
case class Baz(i: Int, s: String, d: Double, f: Foo)
@matsu-chara
matsu-chara / TypeDynamic.scala
Last active August 29, 2015 14:22
TypeDynamicの練習
package TypeDynamic
import scala.language.experimental.macros
import scala.reflect.macros.whitebox
import scala.reflect.macros.whitebox.Context
object TypeDynamic {
class Example() extends Dynamic {
val value: Int = 2
def selectDynamic(name: String): Int = macro selectDynamicImpl