Skip to content

Instantly share code, notes, and snippets.

@nenono
nenono / Closures.scala
Created March 17, 2015 06:36
Scalaでクロージャーを作ってみる
// クロージャー
object Closures {
// lambda式はclosureを作ります
def makeCounter = {
var x = 0 // varは再代入可能な変数の定義
val f = () => { // valは束縛、() => {}の部分はラムダ式
x += 1
x // コードブロック中で最後の式が評価結果になります
}
f
@nenono
nenono / Currying.scala
Last active August 29, 2015 14:17
Scalaでカリー化
// カリー化など
object Currying {
def add(x: Int, y: Int, z: Int) = x + y + z // 式でコードブロック{ ~ }を置き換え可能
def curryTest = {
// defで定義したメソッドだとカリー化できないので、スペース+アンダースコアをつけて関数オブジェクトを取得します
val addFunc = add _
// add _ と書くのは、 add(_, _, _) と書くのと同じっぽい気がします……
// この辺参考になりそうかも: [_ と _ の違い - kmizuの日記](http://kmizu.hatenablog.com/entry/20120917/1347892258)
@nenono
nenono / Collections.scala
Created March 17, 2015 06:49
Scalaのコレクション
// 主要なコレクションクラスの確認と、各種の糖衣構文
object Collections {
// cons cell list
def listTest = {
println("--listTest--")
// create
val list = List("a", "b", "c", "d", "e")
// ↑["a", "b", "c", "d", "e"]
// 対象オブジェクト(引数リスト)の記法は、applyメソッドの糖衣構文です。
// 型名(引数リスト)の記法になっているのは、Listクラスに同名のシングルトンオブジェクト(コンパニオンオブジェクト)が定義されていて
@nenono
nenono / DataTypes.scala
Last active August 29, 2015 14:17
Scalaで基本的な型を定義する
package object DataTypes {
// クラス定義は1ファイルに複数書き並べることもできます
// クラスのインナークラスとしても書けます(Javaと同様、外部クラスへの参照を保持します)。
// package objectは、普通のシングルトンオブジェクトのように書けて、利用側でのimport方法がパッケージの形式になります。
// ---------------------------------------------------------------------------------
// immutable data
class Person(val name: String, val birthYear: Int) {// コンストラクタで同時に読み取り専用プロパティを定義
// その他コンストラクタ
def this() = {
@nenono
nenono / Comparing.scala
Last active August 29, 2015 14:17
Scalaでオブジェクトの比較(等値性、同一性、大小)
// オブジェクトの比較
object Comparing {
// ---------------------------------------------------------------------------------
// 適当なcase class
case class SomeCase(key1:Int, key2:String)
// 適当なclass
class SomeClass(val key1:Int, val key2:String)
def equalsTest = {
println("equalsTest")
@nenono
nenono / Evaluations.scala
Last active August 29, 2015 14:17
Scalaの名前呼び出しとlazyについて
// 評価戦略など
object Evaluations {
def isEven(x: Int) = x % 2 == 0
// 偶数の時だけmessageをprintします。messageは名前呼び出しな引数
def printWhenEven(x: Int, message: => String) = {
if(isEven(x)) println(message)
else println("...")
}
@nenono
nenono / Hello.scala
Created March 17, 2015 06:35
ScalaでHello World!
// objectキーワードはシングルトンオブジェクト
object Hello {
// メイン・エントリ・ポイント
def main(args: Array[String]) {
println("hello, world!")
}
}
@nenono
nenono / withRanking.fsx
Last active August 29, 2015 14:20
シーケンスのソート後の順番を、元の順番を保ったまま取得したい
(*
お題:
https://ideone.com/gtRf08
*)
(*
rankBy 関数 (renameしました withRanking → rankBy)
シーケンスを、指定されたkeySelectorで取得したキーを使用してソートした結果のインデックスとのペアに変換します。
*)
let rankBy (keySelector: 'a -> 'b when 'b : comparison) (source:'a seq) =
@nenono
nenono / splitBy.fsx
Last active August 29, 2015 14:24
任意型リストのsplit
let splitBy (elm:'a) (lis:'a list) =
lis
|> (Seq.fold (fun (a,b) x->if x=elm then (b::a,[]) else (a,x::b)) ([],[])) // a=処理済みリスト b=処理中リスト x=現在の要素
|> (fun (a,b)-> b::a) // 最後の要素だけTuple右辺に残ってしまっているのでリストに結合
|> List.fold (fun s xs -> (List.rev xs)::s) [] // 個別リストの反転と全体の反転
let test1 = splitBy 0 [1;2;3;0;4;5;0;6] = [[1;2;3];[4;5];[6]] // -> true
let test2 = splitBy 0 [] = [[]] // -> true
let test3 = splitBy 0 [1;0;2;0] = [[1];[2];[]] // -> true
@nenono
nenono / join.fsx
Last active August 29, 2015 14:24
任意型リストのjoin
let join (elm:'a) (lis:'a list) =
lis
|> List.fold (fun a x -> elm::x::a) [] // a=処理済みリスト x=現在の要素
|> (function
| x::xs -> xs
| xs -> xs) // 要素数2以上なら1つスキップ もう少し簡潔に書けないものか
|> List.rev
let test1 = join 0 [1;2;3;4;5;6] = [1;0;2;0;3;0;4;0;5;0;6] // -> true
let test2 = join 0 [] = [] // -> true