タグ

ブックマーク / bleis-tift.hatenablog.com (27)

  • Optionに見るコンピュテーション式のつくり方 - ぐるぐる~

    またの名を入門コンピュテーション式(嘘 この記事は、「コンピュテーション式ってどうやって作ればいいの?」に対する自分なりの回答です。 matchのネスト optionを返す3つの関数f, g, hがあったとします。 で、このような処理がしたいとしましょう。 let niceFunction (arg1, arg2, arg3) = match f arg1 with | Some x -> match g arg2 with | Some y -> match h arg3 with | Some z -> Some (x, y, z) | None -> None | None -> None | None -> None この関数は、3つの関数すべてが成功したときだけ、その結果をまとめて成功として返しています。 それ以外は何もせずに失敗として返しています。 このように、「すべて成功した

    Optionに見るコンピュテーション式のつくり方 - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2016/09/08
    “この関数、Bindが要求する形に似ていますね。”のあたりのステップが私には大きくて?ってなってる。
  • 再帰関数のスタックオーバーフローを倒す話 その1 - ぐるぐる~

    再帰関数のスタックオーバーフローを倒す話を何回かに分けてします。 連載目次 再帰関数のスタックオーバーフローを倒す話 その1 ← 今回 CPSとCPS変換の話 再帰関数のスタックオーバーフローを倒す話 その1.5 F#での「末尾」についての話 再帰関数のスタックオーバーフローを倒す話 その2 .NETにおける末尾最適化の方法についての話 再帰関数のスタックオーバーフローを倒す話 その2.5 継続モナドと、F#の残念さの話 再帰関数のスタックオーバーフローを倒す話 その3 すべてをあきらめて再帰をwhileに書き直す方法の話 はじめに 継続渡しスタイルもしくは継続渡し形式(Continuation Passing Style、以降CPS)という言葉を聞いたことがあるでしょうか。 今日はCPSの話をします。 前提知識は、F#のみです。 継続とは CPSの前に、まずは継続の話です。 継続と言って

    再帰関数のスタックオーバーフローを倒す話 その1 - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2015/03/12
    継続渡しスタイル(CPS:Continuation Passing Style)の解説でもある
  • F# 4.0プレビュー版公開! - ぐるぐる~

    拡張機能が使えるVisual Studioが条件付きで無償化されたことによって、 快適な開発環境でF#を学べるようになることでしょう。 それはそれで楽しみなことは間違いないのですが、今回はF#自体の使い勝手の向上に目を向けたいと思います。 昨日はVS Communityが無償提供されたほか、様々な発表がありましたが、F#も4.0のプレビュー版が公開されました。 新機能一覧 プレビュー版までで実装されたものは以下の通りです。 言語に関するもの コンストラクタが第一級関数として扱われるようになった これまでrefを使わざるを得なかった場所にmutableが使えるようになった 32次元配列まで扱えるようになった(今までは4次元配列までだった) (TypeProviderで提供される)メソッドで静的パラメータが使えるようになった listで(配列と同様の)スライシングができるようになった prin

    F# 4.0プレビュー版公開! - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2014/11/14
    コレクションの正規化すっごく良さそう!
  • .NETの標準ライブラリと仲良くする話 - ぐるぐる~

    F# Advent Calendar 2013の9日目の記事です。 昨日の記事は、id:nenono さんの「F# でリフレクション/式木に触れてみる」でした。 リフレクション、扱いにくいですよねぇ・・・ リフレクションといえば、LangExtシリーズの一つとしてReflectionExtなんてのを作っているんですが、 時間がないうえにいろいろ問題もあって滞ってます・・・ さて、今回は.NETの標準ライブラリと仲良くする話(もしくはBasis.Coreの紹介)です。 はじめに F#は.NET Frameworkの資産が使えるため、標準状態で色々なことができます。 これはF#の利点の一つですが、.NET Frameworkは関数型言語のために作られたわけではありません。 そのため、F#から.NET Frameworkの標準ライブラリを使うと、F#の標準ライブラリとは違った使い心地を体験するこ

    .NETの標準ライブラリと仲良くする話 - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2013/12/09
    Basis.Core
  • そろそろPower Assertについてひとこと言っておくか - ぐるぐる~

    タイトルはもちろん釣りで・・・はない! ちょっと真面目に、Power Assertについて意見を述べたいのです。 そもそもPower Assertって何? てきとーに説明すると、 普通の比較演算子で普通にassert書けば、失敗時に各部分式の値を表示してくれる ようなものです。 Groovy製のテスティングフレームワークであるSpockがおそらく家大です((要出典。こういう系の発想は割と昔からあったし、Spock以前に実装例がありそうな気がする。そもそも、Spockは最初からPower Assert持ってたのかも調べないといけない。ちなみに、式木を弄ってAssertを組み立てる、というものであれば(PowerAssertよりも情報量は少なくなるものだけど)、自分の知る限りだと2009年6月にこんな記事があります。 http://themechanicalbride.blogspot.j

    そろそろPower Assertについてひとこと言っておくか - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2013/10/02
    どうなってるかじゃなくて、どこが違うのかを最初にくれよ!ってことか
  • LangExtでのOptionの設計 - ぐるぐる~

    このエントリの最新版はGithubにあります。 Optionの意味を理解していることを前提に、直和型をC#で実現する方法についてを説明し、 LangExtではどういう方針を採用しているのかと、その理由について明らかにします。 バリアント型のC#での設計方針 Optionなどのバリアント型(VBのVariant型のことではありません)をC#で実現する場合、大まかに次の2つの方針があります。 型の階層で表現する タグを判別する値を持つようにする 一つ目の方法は、Option(もしくはMaybe)型の実現方法としてよく使われている方法です。 +-----------+ | Option[T] | +-----------+ △ | +-----+-----+ | | +---------+ +---------+ | Some[T] | | None[T] | +---------+ +----

    LangExtでのOptionの設計 - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2013/05/30
    Option型の目的である「nullの排除」のために、Option型はstructにしている、と。そして、他のライブラリには無いMatch。LangExt素敵!
  • LangExt2.0 リリースしました - ぐるぐる~

    しました。 パッケージ: NuGet Gallery | LangExt 2.0.0.0 コード: LangExt/LangExt · GitHub メジャーバージョンが上がって、1.xとは互換性のないものになっています。 そこらへんについては、「なぜそうしたのか」等をまとめて公開していくつもりです。 で、リリースしておいてなんですが、使用にあたっていくつかの注意点があります。 標準クエリ演算子(SelectとかWhereとか)を捨ててます。ふつうのC#erにはお勧めしません。 Grouping系のメソッドは未実装です。実装できてないものがいっぱいあって、それを使って実装したいのでまだありません。いつか作ります。 Join系のメソッドは未実装です。え、これ、必要・・・? Lenはおとーふさんの要望により、Lengthになるかもしれません。自分としてはLenで十分だと思うのですが・・・ →

    LangExt2.0 リリースしました - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2013/05/22
    関数型C#用ライブラリ / 標準クエリ演算子だけでなく、IEnumerable<T>も捨てたのか―
  • Java 8を関数型っぽく使うためのおまじないをF#でやってみた - ぐるぐる~

    Java 8を関数型っぽく使うためのおまじない - きしだのはてな Java 8を関数型っぽく使うためのおまじないをC#でやってみた - ぐるぐる~ Java も C# も大変ですね。 F# さんは、ラムダ式も関数型も最初から使えたので、似たようなことはすでにできます。 上記の記事のパクリなので、上記の記事をまずは読んでから読むことをおすすめします。 関数型(関数を表す型の方) F# では FSharpFunc という型があります。名前空間や型パラメータまで含めると、Microsoft.FSharp.Core.FSharpFunc<'T, 'U> です。 ただ、この型を直接使うことはありませんし、見ることもそうそうないです。 その代わりに、'T -> 'U という表記が使えます。「'T を受け取って 'U を返す関数」と読みます。 ちなみに、型パラメータの最初に「'」が付いているのが割と大

    Java 8を関数型っぽく使うためのおまじないをF#でやってみた - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2013/05/01
    やはりF#などの関数型言語以外でこれやるの苦痛ですね
  • 「変数に型がないということの利点について考える」の問題について考える - ぐるぐる~

    id:perlcodesample さんの 変数に型がないということの利点について考える - サンプルコードによるPerl入門 から。 ううむ。 けれども、型がないということは、当に素晴らしいことです。 型がないことによって、たくさんの面倒から解放されるからです。 冒頭のこれが、「静的型付き言語にはメリットが(ほとんど)ない」と言っているように思えてしまいます。 コメントのやり取りを見ても、ある程度そう考えているように受け取れます。 勘違いなどが多く見られたので、補足というか、反論というか、そんな感じのことを書きます。 追記: ごく一部、このエントリを「動的型付き言語と静的型付き言語を比べて、静的型付き言語の方が素晴らしい言語である」ということを言うためのものだと勘違いしている人を見かけました。 このエントリは、そこについては言及していません。 あくまで、元記事で「動的型付き言語のメリッ

    「変数に型がないということの利点について考える」の問題について考える - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2013/03/01
    あんていのぐるぐるさん
  • 再帰で考える - ぐるぐる~

    再帰は関数型言語を構成する重要な部品の一つです*1。 しかし、手続型言語に慣れたプログラマにとって、再帰で考えるというのは難しいものがあります。 このエントリは、そういうプログラマが再帰で考えることができるようになるために書きました。 言語としては、F# と C# を使っています (推奨は F#。C# の例は実用性が無いに等しい) が、Java プログラマでもある程度読めるでしょう。 前提条件として、これらの言語の文法は知っているものとします。 特に、C# で言う Func デリゲートを多用します。 すごい長いので、時間があるときに一気にどうぞ。 再帰以外の話もちょろちょろと出てきます。 再帰の重要性 いきなりですが、再帰はあくまで最後の手段です。 普通は再帰をカプセル化した関数を使うことになります。 通常使わないのであれば、再帰を学ぶことに意味はないのでしょうか? いいえ、それでも再帰を

    再帰で考える - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2013/01/16
    C#版コードが後半読むのきついけど、これが手続型言語と関数型言語の違いなのかね
  • 遅延評価いうなキャンペーンとかどうか - ぐるぐる~

    遅延評価については以前も書いてるんですが、そのときは結論なしでした。 が、ちょっと考えるところがあって、言語を Java に絞って自分の考えを明確にしておきます。 結論から書きましょう。 「Java(とC#) で遅延評価って書いてあるものは遅延評価ではない」です。 Java における「評価」とは まず一番最初に、Java で「評価」って言うと、どういうことを指すのかを確認しておきます。 言語仕様の該当部分を要約すると、こんな感じでしょうか。 プログラム中の式を評価すると、結果は 変数 値 無し のうちのどれかとなる。 評価した結果が値になる、というのはいいでしょう。それ以外の 2 つを軽く説明します。 評価の結果が「変数」とは? コメント欄で指摘が入っています。 代入の結果は変数ではありません(15.26)。 結果が変数となるのは、ローカル変数、現在のオブジェクトやクラスの変数、フィールド

    masaru_b_cl
    masaru_b_cl 2013/01/07
    「評価」の言語仕様上での定義からすると、JavaとかC#とかは「遅延評価」じゃないんじゃね?というマサカリ
  • C# から使いやすい F# コードの書き方 - ぐるぐる~

    さて始まりました、F# Advent Calendar 2012 です。 今年は、「実用」がテーマと言うことで、F# で書いたコードを C# から使いたくなった時に気を付けるべきポイントなどをまとめました。 F# と C# で異なる名前を付ける F# では、module に定義する関数や変数の名前は、lowerCamel で付けるのが一般的です (List.map など)。 しかし .NET の世界では、これらの名前は基的に PascalCase で付けることになっています。 CompiledName 属性を使うことで、この差を埋め、F# からは lowerCamel に、C# からは PascalCase に見える名前を付けることができるようになります。 (* F# *) module Util = [<CompiledName "ToStr">] let toStr x = spri

    masaru_b_cl
    masaru_b_cl 2012/12/03
    関数型言語C#の解説かと思った
  • Java の語彙で Maybe を説明してみる - ぐるぐる~

    java-jaで例外処理の話をしてきました - 西尾泰和のはてなダイアリー を読んで。 Maybe は値があるかないかを型で表すことができます!そう、直和型なんです!とか言われてもイミフだと思うのです(リンク先のエントリがそう説明してるわけではないですが)。 Java の語彙で Maybe の説明をできたら嬉しい人もいるんじゃないかなぁ、とかなんとか。 ただし、書いてたら結構長くなりました。時間がある人はどうぞ。 Maybe? null より安全に「値がないこと」が扱えるものだよ スタート地点としてはこれでいいでしょう。 以降で、「なんで安全なの?」という全うな疑問に答えてみたいと思います。 問題点 int で説明すると煙に巻いてしまうような気がしたので、User クラスを見てみます。 import java.util.*; class User { final String name;

    Java の語彙で Maybe を説明してみる - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2012/06/29
    わっふるわっふる
  • デブサミで自分戦略についてしゃべってきた - ぐるぐる~

    いやぁ、ためになるセッションでした。 自分が若造でまだまだぺーぺーだと痛感させられましたね。 これに呼んでもらわなかったら今年はデブサミパスしようと思っていたので、呼んでもらって当感謝です。 発表資料 自分戦略 View more presentations from bleis tift 話さなかったこと この業界に入ったきっかけになった出来事 この業界に入るきっかけとなったのは、鈴鹿高専の推薦に受かったことです。 高専の推薦って、結構早い時期に合否が出るので、受験勉強から一抜けしちゃったんですよね。 一人だけ暇になっちゃって、先生からも「周りはまだ受験シーズン真っ最中なんだから、嬉しいかもしれないけど浮かれすぎないでね」とか言われちゃって。 で、「暇をつぶすために何かやろう。せっかくだから高専に入ってから役立ちそうなことやろう」と思い立ったんですよ。 その時やったのが、微積とプログラ

    デブサミで自分戦略についてしゃべってきた - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2012/02/19
    「うずらフォント」覚えました!
  • Quick Test Switcher 1.1 をリリースした - ぐるぐる~

    テストコードと実装コードの切り替えを支援する Visual Studio 用のアドインを作りました。 マニュアル的なもの Visual Studio Gallery のページ ソースコード コードを開いた状態で Ctrl-0 を押すと、対応するファイルがある場合にそれを開きます。 頻繁にテストコードと実装コードを切り替える TDD のお供にどうぞ。

    Quick Test Switcher 1.1 をリリースした - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2012/02/14
    きたこれ!
  • コンフリクトが発生しなくても壊れる場合 - ぐるぐる~

    push したら誰かが先に push していたので失敗した。 なので pull したが、コンフリクト (競合) は発生しなかったので何も確認せずにそのまま push した。 何も問題なさそうですね。 ・・・当ですか? 例えばこんな状況を考えてみましょう。 最初の状態 A さんと B さんと C さんが登場します。 作っているのは Web ページで、コードはこんな感じ。 <html> <head> <title>hoge</title> <style> .menus { overflow: auto; } ul { margin: 0; padding: 0; list-style-type: none; } .button { float: left; width: 100px; margin: 0; padding: 10px 0; text-align: center; backgr

    コンフリクトが発生しなくても壊れる場合 - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2012/01/18
    rebaseともっと仲良くならんといけんなぁ
  • 質問に答えてみる - ぐるぐる~

    リポジトリ見てたら、question.txt なるファイルを見つけたので、その質問に答えてみます。 hard オプションなしの git reset に何の意味があるの? reset には、ファイルを指定する reset と、ファイルを指定しない reset の 2 種類があります。 で、hard オプションを持つのは、ファイルを指定しない方です。 まずはこちらから見ていきましょう。 ファイルを指定しない reset ファイルを指定しない reset には、 soft mixed hard merge keep と言う 5 つのモードがあります。 ここでは代表的な上三つを紹介します。 デフォルトは mixed で、これが質問にあった「hard オプションなしの git reset」です。 soft このモードでは、HEAD のみ指定コミットの状態となり、インデックスも作業ツリーも変更されませ

    質問に答えてみる - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2012/01/17
    Gitの使い方の勉強になる。push頻度は代々おんなじ感じだなー。 / トピックブランチ作成→git-now*n→git now --rebase→git co master→git merge -→git br -d トピックブランチ→git push が基本
  • 業務で使う関数型言語 (F# 編) 〜 はじめに - ぐるぐる~

    「関数型言語なんて実際の仕事で使えないよ」 こんな声を聞くことがあります。 個人的には、(静的型付けの) 関数型言語が持つパワーは仕事であっても発揮できると考えています。 しかし、自分の観測範囲ではそういう話がまとまっているものはあまり見かけません。 大抵が関数型言語の機能を紹介するまでにとどまっていて、それを実際にどう使えばいいのかについては言及していません。 そこで、一番得意とする F# を例にして、この機能はこういう風に使える、というのをまとめることにしました。 ある程度、オブジェクト指向プログラミングの知識があることを前提としています。 連載目次 内容は変更される場合があります。 レコードで値オブジェクトを簡単に作る 判別共用体で再帰的なデータ構造を簡単に作る 複数のリストの走査 出力引数とタプル、もしくは option より private な関数 エラー処理を考える 数値に意味

    業務で使う関数型言語 (F# 編) 〜 はじめに - ぐるぐる~
  • TDD の基礎体力と、TDD に対する想い - ぐるぐる~

    TDD Advent Calendar 2011 の 4 日目の参加エントリです。 前半では、TDD を学ぶ前に身に付けておくといいと思う基礎体力について書きました。 後半は、まぁ、その。後悔はしていません。反論ウェルカム、議論しようぜ。 不安をテストに 「レッド - グリーン - リファクタリング」は、TDD の根っこの部分であり、これ自体が「どう TDD をやればいいか」を教えてくれるものではありません。 それに対して、「不安をテストに」というのは、「どう TDD をやればいいか」という指針を与えてくれる言葉です。 この言葉自体は、TDD Boot Camp で自分のものにできました。 不安については、テスト駆動開発入門では (言及されているものの) 自然に組み込まれていて、最初に読んだときには全然気づきませんでした。 しかし、TDDBC で id:t-wada (和田さん) に短くて

    TDD の基礎体力と、TDD に対する想い - ぐるぐる~
    masaru_b_cl
    masaru_b_cl 2011/12/04
    "でも、それはあくまでOOコード養成ギブスの TDD 版のようなものなんです。"
  • SCM Boot Camp 2 in Tokyo に行ってきた - ぐるぐる~

    今回は Git の講師として参加しました。 2 回目と言うこともあって、よりスムーズに進めることができたように思います。 個人的なもくろみ 今回参加して、SCM Boot Camp の DVCS イベントの部分はある程度パッケージ化したいと考えるようになりました。 まだ 2 回しかやっていませんが、DVCS (少なくとも Git) の効率的な習得のためのスキームというのが見えてきた感じです。 最終的には、講師が 1 人いれば小規模なイベントを開くことのできるところまで落とし込めるのでは、と考えています。 以下時系列順の雑多な感想や補足など 開催前 今回は、開催の準備として数回 Lingr によるミーティングを行いました。 資料の作成も段階的に行うことができたのでフィードバックを取り入れることができてとてもよかったです。 にも関わらず、 30秒前までずっと作り続けていたらしいので、たぶんあり

    masaru_b_cl
    masaru_b_cl 2011/11/21
    知りませんでした・・・ > TortoiseSVN ユーザのための Git Bash 入門の必要性「ディレクトリやオプションとかを Tab で補完できる話 あと「困ったらとりあえず Tab を 2 回叩く」とかそういう」