Skip to content

Instantly share code, notes, and snippets.

View yuroyoro's full-sized avatar
🍣
🍣

しいたけ yuroyoro

🍣
🍣
View GitHub Profile
scala> def Y[A,B](f:((A => B),A) => B,x:A):B = f((y:A) =>Y(f,y),x)
Y: [A,B](f: ((A) => B, A) => B,x: A)B
scala> Y((f:Int => String,n:Int) => n match{case 0 => "ば";case 20 => "あ" + f(n-1);case m =>"ば" + f(n-1);},20)
res32: java.lang.String = あばばばばばばばばばばばばばばばばばばばば
scala> Option({ def Y[Int,String](f:((Int => String),Int) => String,x:Int):String = f((y:Int) =>Y(f,y),x);Y( _:((Int => String),Int) => String,_:Int)}).map{y => y((f:Int => String,n:Int) => n match{case 0 => "ば";case 20 => "あ" + f(n-1);case m =>"ば" + f(n-1);},20)}.get
res42: String = あばばばばばばばばばばばばばばばばばばばば
scala> class Foo[A](v:A)(implicit val mf:Manifest[A]){
| def typeParam = mf.erasure
| }
defined class Foo
scala> (new Foo(99)).typeParam
res2: java.lang.Class[_] = int
scala> (new Foo("HOGE")).typeParam
res3: java.lang.Class[_] = class java.lang.String
@yuroyoro
yuroyoro / GenericsTrick.java
Created January 20, 2011 07:09
型パラメータTのインスタンスを無理矢理(ヤメテーッッ)生成する方法
public class GenericsTrick {
public static void main(String[] args){
try{
System.out.println(
(new GenericsTrick()).createInstance(new Foo[]{})
);
}catch(Throwable e){
e.printStackTrace();
}
#### ####
#### ####
#### ####
#### ####
###########################################################################################
###########################################################################################
###########################################################################################
###########################################################################################
#########
@yuroyoro
yuroyoro / Main$.jad
Created March 17, 2011 07:25
scalaのlazy valってこんな風に初期化されるんですぜ(2.9)
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: Main.scala
import scala.Predef$;
import scala.ScalaObject;
import scala.collection.immutable.StringLike;
import scala.runtime.BoxedUnit;
import scala.util.Random$;
@yuroyoro
yuroyoro / Nuclear.scala
Created March 17, 2011 08:08
Scalaのlazy valを強制的に再評価する(2.9)
class Nuclear{
lazy val radioactivity = {
println( "%sμSv/hだって " format util.Random.nextFloat * 400f)
"(((((((( ;゚Д゚))))))))ガクガクブルブルガタガタブルブル "* util.Random.nextInt(4)
}
}
@yuroyoro
yuroyoro / DynamicTest.scala
Created March 26, 2011 06:51
scala2.9.0.RC1でのDynamicのテスト
[0]ozaki@mbp $ scala -Xexperimental [~/sandbox/scala/work][0]
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
Welcome to Scala version 2.9.0.RC1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.
scala> trait DI extends Dynamic {
| def applyDynamic(name:String)(args:Any*):Any = println("Hello, %s %s" format( name, args.mkString("[", ", ", "]")))
| }
defined trait DI
@yuroyoro
yuroyoro / Main.scala
Created April 18, 2011 06:52
Scalaの無限リスト(Stream)でいろいろと
// 初期値とstepを指定して永遠にカウントするItrator
class Counter[T:Numeric](init:T = 0,step:T = 1) extends Iterator[T] {
var cnt = init
def hasNext = true
def next = {
cnt = implicitly[Numeric[T]].plus(cnt, step)
cnt
}
// 自分をStreamにする
def asStream = Stream.continually( next )
@yuroyoro
yuroyoro / ComposableFunction1.scala
Created April 28, 2011 04:33
Scalaでも>>とか<<で関数合成できるように。
scala> trait ComposableFunction1[-T1, +R] {
| val f: T1 => R
| def >>[A](g:R => A):T1 => A = f andThen g
| def <<[A](g:A => T1):A => R = f compose g
| }
defined trait ComposableFunction1
scala> implicit def toComposableFunction1[T1,R](func:T1 => R) = new ComposableFunction1[T1,R]{ val f = func }
toComposableFunction1: [T1,R](func: (T1) => R)java.lang.Object with ComposableFunction1[T1,R]