Hatena::ブログ(Diary)

当面C#と.NETな記録 このページをアンテナに追加 RSSフィード

2008/2/29 (金)

[] 手軽にアニメーション  手軽にアニメーションを含むブックマーク  手軽にアニメーションのブックマークコメント

WPF のアニメーションの簡単さがスゴイ。マウスが乗ったらミョンと大きくなって、はずれたらミョーンと縮むアニメがこれだけでできちゃう。

<Style x:Key="PhotoItems" TargetType="{x:Type ListBoxItem}">
  <Setter Property="MaxHeight" Value="150" />
  <Setter Property="MinHeight" Value="150" />
  <Setter Property="MaxWidth"  Value="150" />
  <Setter Property="Margin" Value="50" />
  <Style.Triggers>
    <EventTrigger RoutedEvent="Mouse.MouseEnter">
      <EventTrigger.Actions>
        <BeginStoryboard>
          <Storyboard>
            <DoubleAnimation Duration="0:0:0.4" 
              Storyboard.TargetProperty="MaxHeight" To="250" />
            <DoubleAnimation Duration="0:0:0.4" 
              Storyboard.TargetProperty="MaxWidth" To="250" />
            <ThicknessAnimation Duration="0:0:0.4" 
              Storyboard.TargetProperty="Margin" To="0" />
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger.Actions>
    </EventTrigger>

    <EventTrigger RoutedEvent="Mouse.MouseLeave">
      <EventTrigger.Actions>
        <BeginStoryboard>
          <Storyboard>
            <DoubleAnimation Duration="0:0:1" 
              Storyboard.TargetProperty="MaxHeight" />
            <DoubleAnimation Duration="0:0:1" 
              Storyboard.TargetProperty="MaxWidth" />
            <ThicknessAnimation Duration="0:0:1" 
              Storyboard.TargetProperty="Margin" />
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger.Actions>
    </EventTrigger>
  </Style.Triggers>
</Style>

こんなのを書いておいて、

<ListBox ItemsSource="{Binding Path=Files}"
  ItemTemplate="{StaticResource ImageTemplate}"
  ScrollViewer.HorizontalScrollBarVisibility="Disabled"
  ItemContainerStyle="{DynamicResource PhotoItems}">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel ItemHeight="250" ItemWidth="250" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

みたいにバインドするだけ。スゲー!

う〜ん、XAML が冗長なんで長くて簡単に見えないかもしれないけど(^^;、肝は変更したいプロパティの時間間隔と最終的な値を書いただけ。

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

エッセンシャルWPF:Windows Presentation Foundation (Programmer's SELECTION)

WPF の勉強には「エッセンシャル WPF」がおすすめです。WPF のアーキテクトさんが書いた本で、「WPF ではイベントハンドラを使うのではなく、コマンドを使うことを推奨する」みたいなことがたくさん書いてあります。設計方針や、何かがそうなっている理由や、当初別の方針だったけどこういう理由でそれはできなかったみたいなことも詳しく載ってます。ぜひ読んでみてください。

2008/2/26 (火)

[] 条件判断  条件判断を含むブックマーク  条件判断のブックマークコメント

WPF のうれしい機能はたくさんあるけど、今夢中なのがデータテンプレート。見た目の雛形を定義しておけば、バインドした CLR のオブジェクトなどを表示してくれます。従来ならユーザーコントロールを書いて、その中で細々と表示をカスタマイズしてた部分が XAML だけでできちゃう感じ。

驚くのが条件判断の機能を持ってること。これは XAML の機能じゃなくて WPF の機能なのがちょっと残念だけど、CLR オブジェクト中の enum 値によって見た目を変える、みたいなのが XAML だけでできちゃう。

もうちょっと複雑な判断は DataTemplateSelector ってコードを書かないといけないけど、まあなんにせよ従来のようにコントロールをガリゴリ書く作業からは解放される。

XAML に条件判断と繰り返しが欲しいな。

参考:データ テンプレートの概要

http://msdn2.microsoft.com/ja-jp/library/ms742521.aspx

Adobe AIR 1.0 の英語版が正式リリースされたけど、WPF や Silverlight とどっちが流行るんだろう。

トラックバック - http://d.hatena.ne.jp/siokoshou/20080226

2008/2/24 (日)

[] むずい  むずいを含むブックマーク  むずいのブックマークコメント

最近 WPF で遊んでるんだけど、ムズイね、これ。文字のセンタリング程度で四苦八苦したり…。エッセンシャル WPF を読みつつやってますが、いろんな GUI の良いとこ取りで現代的な理想の GUI って思想には共感できるものの、とっつきにくい!簡単に使えるようにしたつもりらしいけど、膨大な概念を学ばないとちょっとしたこともできないものになってしまってるような…。

エクスプローラーの画像フォルダの縮小表示みたいなちゃちい画像ビュアーを作ってたんだけど、ListBox の既定の並び方を変えて、エクスプローラー風に並べるのに手間取ったりとか…。最初はなんでもそんなもんだけど、でも難しめだと思うなぁ。使いこなせばすごい力を発揮するのは間違いないけど。最初が大変だと敬遠されそうな気が…。

VisualStudio のデザイナは XAML 使い養成ギブスでしかないしw インテリセンスは助かるけど。

合成とデータバインディングとテンプレートが強力なので、コード書いたら負けと思ってしまうのも、いいのか悪いのか(^^;

FolderBrowserDialog 相当が欠けてたりなんてのも、まだまだ道半ばって感じですね。コントロールは今後追加されるだろうからいいけど、もっと簡単にする方面の取り組みも期待したいところ。

それにしても、必要なコードの少なさにはビックリ。そして XML の大量の山括弧にウンザリw INotifyPropertyChanged にゲンナリ。これ自動生成にするとか属性にするとかして欲しい。

最後に ListBox の並びの変え方。既定の VirtualizingStackPanel を WrapPanel に置き換えてます。

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

横スクロール禁止がミソ。これがわかんなくて、いろいろと壮大なことやってた(^^;

shiba-yanshiba-yan 2008/02/25 00:17 >コード書いたら負けと思ってしまう
私も同じくコード書いたら負けだと思ってしまってます、イベントハンドラぐらいはさすがに書きますが(笑
慣れてきたら ListBox の ItemsPanel を変更するのではなく、ItemsControl とユーザーコントロールを使って自分好みのコントロールを作ってしまうのも面白いと思いますよ。

siokoshousiokoshou 2008/02/25 07:43 お〜いいですねぇ。VirtualizingWrapPanel をいつか作ってみたい!

2008/2/21 (木)

[] .NET 3.5 Client Product Roadmap  .NET 3.5 Client Product Roadmapを含むブックマーク  .NET 3.5 Client Product Roadmapのブックマークコメント

http://weblogs.asp.net/scottgu/archive/2008/02/19/net-3-5-client-product-roadmap.aspx

vice president になったらしいスコットガさんの blog で、すばらしい発表が!

  • .NET Framework セットアップの改善
  • コールドスタートアップ時間とメモリ使用量の改善 (.NET2.0, 3.0, 3.5)
    • コールドスタートアップ時間 25%〜40% 改善
    • コンパイルなど何かする必要はなし。自動的に改善。
  • WPF パフォーマンス改善
    • DropShadow とかがついにハード処理に。API など変更なしなのでコード変更は不要。新エフェクトもある。
    • ほかいろいろ。原文みて。
  • WPF コントロール追加。DataGrid, Ribbon, and Calendar/DatePicker (追記:この部分はこの夏じゃなくて今年遅くになってる。WPF パフォーマンス改善は夏と書いてあるので、今年2回アップデート予定?)
  • VS2008 WPF デザイナー改善 (今のやつはあんまりだよね(^^;)

この夏に CLR のアップデートとして出すようです。SP1 こそ本番とかいう 2ch の書き込みは本当だったのか…。

コメント欄がすごい盛り上がり。

aspxaspx 2008/02/21 09:02 夏に3.5SP1 と SQL2008が来るとなると、期待できますね。

siokoshousiokoshou 2008/02/21 09:19 期待できますねー。メモリ使用量とスタートアップ時間は個人的に最も気になる部分だったのでワクワクです。

NyaRuRuNyaRuRu 2008/02/21 11:55 先日、氏が来日した時に軽く紹介は受けていましたが、こういう話を blog で発表ってのがまた今風ですなぁ。
MIX 08 でまとめて発表かと思ってましたが。

とよく見てみたら Silverlight 関連は巧妙に伏せられてますな。「続きは MIX で」メソッド?

個人的には Xbox 360 CLR 開発へのリソース配分をもうちょい増やして欲しいような。
Silverlight CLR ベースにするだけで、だいぶ印象変わるんじゃないかと。

siokoshousiokoshou 2008/02/21 13:43 今風ですよね〜、私もそう思いました。MIX08 で言えばいいのに(^^;
Silverlight はついに 2.0 が?

2008/2/16 (土)

[] PageDefrag  PageDefragを含むブックマーク  PageDefragのブックマークコメント

ブクマしただけじゃもったいない気がしたのでこちらにメモ。

http://www.microsoft.com/technet/technetmag/issues/2007/09/UtilitySpotlight/default.aspx?loc=jp/

ページファイルやレジストリハイブ等々、ロックされてて普通じゃデフラグできないファイルをデフラグする Sysinternals のツール(の日本語での説明)。これはイイ!

トラックバック - http://d.hatena.ne.jp/siokoshou/20080216

2008/2/14 (木)

[] Y はまわる  Y はまわるを含むブックマーク  Y はまわるのブックマークコメント

今回の Y ブームの発端が id:taguo さんで、さらにそのきっかけとなった一部が自分のエントリだったようです。今回のブームでλ計算をちょこっと勉強してみたので、これぞまさに再帰ですね!

飽きたと言っておきながらプチ数学ブームは、人物史として形を変えて続いていたり。

Y あたりの話は、数理論理学や数学基礎論に属するようです。集合論の矛盾にはじまり、ヒルベルト(ヒルベルト・プログラム)、ゲーデル(不完全性定理)、ノイマン(あまり関係ないけど)、アロンゾ・チャーチ(ラムダ計算)、チューリング(ラムダ計算)、クリーネ(正規表現の発明者)、ハスケルといった天才たちが関わっています。それぞれ wikipedia で調べるとおもしろいです。ゲーデルの人生に涙したり、ノイマンがコンピュータより計算が速いのかよ!とか。

プログラム言語 Haskell の名前の由来となっているハスケルカリーさんが研究していたのが組合せ論理(combinatory logic)というもので、チャーチのラムダ計算ととても似ているものです。コンビネーターってのはここから来た名前みたいですね。数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語 って本が気になります。近所の図書館にあるようなので、今度読んでみるかも。

というキーワードだけのたいした内容のないエントリーでトラバして、リンクも再帰させておきますw

NyaRuRuNyaRuRu 2008/02/16 12:35 こっちでも再帰しておきましたよ.
デブサミの Ask the Speaker 会場にて,id:yuji1982 さんを交えて,波村さんと「最近日本で Y Combinator が大ブームだったんですよ」等々.

siokoshousiokoshou 2008/02/16 17:25 !!

トラックバック - http://d.hatena.ne.jp/siokoshou/20080214

2008/2/13 (水)

[] リファレンスコードをネットにアクセスせずにステップ実行する  リファレンスコードをネットにアクセスせずにステップ実行するを含むブックマーク  リファレンスコードをネットにアクセスせずにステップ実行するのブックマークコメント

昨日のエントリの NetMassDownloader で公開されたコードを全部落として、ネットアクセスなしでリファレンスコード内をステップ実行する方法のメモ。一行実行するたびに地球の裏側までリクエストが飛んでいって帰ってくる(?)のを待つ必要がなくなり、サクサク動きます。

VisualStudio2008ですでにリファレンスコードを読む設定をしてあることが前提です。

まずは必要なコードを全部落とします。PowerShell と昨日の NetMassDownloader が必要です。コマンドは例えばこうなります。

.\NetMassDownloader.exe -fo -o C:\ReferenceSource -d C:\Windows\Microsoft.NET\Framework\v2.0.50727

.\NetMassDownloader.exe -fo -o C:\ReferenceSource -d 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0'

.\NetMassDownloader.exe -fo -o C:\ReferenceSource -d C:\WINDOWS\Microsoft.NET\Framework\v3.0\WPF

これで C:\ReferenceSource ディレクトリに PDB ファイルとソースコードがドバっと落ちてきます。実行にはかなり時間が掛かります。x64 が必要ならそれも、Reference Assemblies の v3.5 に System.Web.Extensions.DLL があるので、必要ならそれも追加で落としてください(ほかのディレクトリにも細々とあるかも?)。

VisualStudio で、ツール→オプションのデバッグ→シンボルを開いて、「シンボルファイル(.pdb)の場所」に C:\ReferenceSource を追加。

次に、デバッグ→全般の「ソースサーバーサポートを有効にする」のチェックをはずし、「元のバージョンと完全に一致するソースファイルを必要とする」のチェックもはずして、OK ボタンを押します。

さらに各ソリューション(プロジェクトじゃないですよ)のプロパティページの共通プロパティ→デバッグソースファイルの「ソースコードを含んでいるディレクトリ」に先ほどの C:\ReferenceSource\ を追加して、OK ボタンを押します。これは面倒なことに全部のソリューションで一つずつ実行する必要があるようです(>_<)

これで、リファレンスコード内でステップインをしても、ネットにお伺いを立てにいかなくなり、サクサク動くようになりました。

手順に過不足がありそうなので、何か見つけたらコメントいただけるとありがたいです。

2008/2/12 (火)

[] ソースコードを一気にダウンロード  ソースコードを一気にダウンロードを含むブックマーク  ソースコードを一気にダウンロードのブックマークコメント

こ、これは…。ついでに2005対応だそうで…。いいんだろうか。

ところで、生のソースコードおもしろいですね。こんなことしてたのかーと、ついつい読んでしまいます。

2008/2/8 (金)

[] コレクション初期化子と ICollection<T>  コレクション初期化子と ICollection<T>を含むブックマーク  コレクション初期化子と ICollection<T>のブックマークコメント

おもしろい記事を見つけて読みふけってしまったので、おもしろいとこだけぎゅぎゅっと抜粋。

via http://blogs.msdn.com/madst/archive/2006/10/10/What-is-a-collection_3F00_.aspx

コレクション初期化子の設計話。なんで「IEnumerable + Add メソッド」なんて変な設計なのさ?って疑問への答え。

駄訳

コレクションとは何か?

ICollection は役にたたない、失敗だった。そして ICollection<T> で直した(注:実際、ICollection<T> は ICollection と無関係)。これでみんな ICollection<T> 使うよねヽ(^o^)丿→ 誰も使わなかった(T-T)

誰もは言いすぎた。でも、コレクション初期化子を設計する際、LINQ + リフレクションで .NET フレームワークを調べてみたら、たった14クラスしか使っていなかった(・・;

コレクションって何よ?もっと調べてみた。

  • IEnumerable & public Add メソッド : 189
  • 非 IEnumerable & public Add メソッド : 42

つまり、コレクションとは「IEnumerable を実装して、public Add メソッドを持ってる型」だ!

もっと調べてみた。

  • Add メソッドを複数持ってる : 28
  • Add メソッドの引数が1つじゃない : 30

もっとよくするために、{} で囲って引数が複数でも呼べるようにした、初期化リストはそれぞれオーバーロードを解決するようにした。

これは正しい?

この結果の言語設計はパターンに基づいた取り組み方だ。Add がなくなってもコンパイラは文句を言わない(注:誤訳かも)。そのうち、みんなが ICollection<T> を実装する利点を認めてくれると思ってる。コレクションを初期化するだけじゃなく、コンパイラがチェックもしてくれる。


おまけ

おもしろいので原文もぜひどうぞ。コメント欄もなかなかです。

Queue のような Add を持ってないクラスのために、拡張メソッドの Add も呼ぶようにしたら?って意見が出てますが、もう遅いと却下。次版?Queue はコンストラクタが豪華なので Queue にはいらないけど。

Chris Sells さんも書き込んでます。ちなみに c.GetInterface( "ICollection`1" ) != null で拾えました。

オーバーロード解決を試してみました。

using System;
using System.Net.Mail;

class P
{
  static void Main()
  {
    var col = new MailAddressCollection
      {
        "example@example.com",
        new MailAddress( "example2@example.com", "ex2" ),
      };

    foreach ( var item in col )
      Console.WriteLine( item.Address );
    Console.ReadKey();
  }
}

できた!

まーでも、2.0以降、コレクションは滅多に書く必要なくなったよね(^^;

ICollection<T> カワイソス(´Д⊂

トラックバック - http://d.hatena.ne.jp/siokoshou/20080208

2008/2/6 (水)

[] 飽きてきた  飽きてきたを含むブックマーク  飽きてきたのブックマークコメント

λにはじまり、帰納的関数とかゲーデルとか集合とかプチ数学ブームしてました。でも、難しいことは理解できず、早くも飽きてきた…。

プチリンク遊び

Console.WriteLine(
  "siokoshou"
    .OrderBy( c => c )
    .Distinct()
    .Aggregate( "", ( s, c ) => s += c ) );
// hikosu

[] サンタクロースは  サンタクロースはを含むブックマーク  サンタクロースはのブックマークコメント

いるよ

[] 式木の ==, Equals  式木の ==, Equalsを含むブックマーク  式木の ==, Equalsのブックマークコメント

Expression<Func<int, int>> expr = x => x + 1;
Expression<Func<int, int>> expr2 = x => x + 1;
Console.WriteLine( expr == expr2 ); // false
Console.WriteLine( expr.Equals( expr2 ) );  // false
Console.WriteLine( expr.ToString() == expr2.ToString() );  // true

なるほどねー(T-T)

最適化は JIT の仕事だよねー、みたいな…

[] λ計算で 1+2  λ計算で 1+2を含むブックマーク  λ計算で 1+2のブックマークコメント

すっかり飽きる前にλ計算してみます。お題は 1+2 が 3 になるかどうか。

チャーチ数と足し算の定義はwikipediaのものを使います。

1 := λf x. f x
2 := λf x. f (f x)
3 := λf x. f (f (f x))

PLUS := λm n f x. m f (n f x)

PLUS 1 2 をβ変換(引数に変数を入れて計算すること)していった結果(正規形)が 3 になりますかどうか。

1 と 2 はα変換(変数名が重ならないように付け替えること)して、

1 := λg y. g y
2 := λh z. h (h z)

とします。式の意味は変わってません。

では、開始。

( λm n f x. m f (n f x) ) ( λg y. g y ) ( λh z. h (h z) )
→ ( λn f x. ( λg y. g y ) f (n f x) ) ( λh z. h (h z) )
→ ( λf x. ( λg y. g y ) f (( λh z. h (h z) ) f x) )
→ λf x. ( λy. f y ) (( λh z. h (h z) ) f x)
→ λf x. f (( λh z. h (h z) ) f x)
→ λf x. f (( λz. f (f z) ) x)
→ λf x. f ( f (f x) )

3 になった! 1+2 ができただけなのに、とてもうれしいw

ついでに、間違いないよね?とドキドキしてます(^^;

1+2 ごときでw

トラックバック - http://d.hatena.ne.jp/siokoshou/20080206

2008/2/5 (火)

[] デリゲートと式木の文字列表現  デリゲートと式木の文字列表現を含むブックマーク  デリゲートと式木の文字列表現のブックマークコメント

ふと思いついて試してみました。

using System;
using System.Linq.Expressions;

class Program
{
  static void Main()
  {
    // コンパイルエラー : 演算子 '.' を 'ラムダ式' 型の
    // オペランドに適用することはできません。
    //Console.WriteLine( ( x => x + 1 ).ToString() );

    // System.Func`2[System.Int32,System.Int32]
    Func<int, int> func = x => x + 1;
    Console.WriteLine( func.ToString() );

    // x => (x + 1)
    Expression<Func<int, int>> expr = x => x + 1;
    Console.WriteLine( expr.ToString() );

    Console.ReadKey();
  }
}

なるほどね。

トラックバック - http://d.hatena.ne.jp/siokoshou/20080205

2008/2/3 (日)

[] 数字も関数で  数字も関数でを含むブックマーク  数字も関数でのブックマークコメント

Y の a については正確な理解はひとまずあきらめました(+_+) 頭から煙が出そうになるw

高階関数 + 再帰で、しかも複雑な式がどう展開されてるか追いかけるのは困難…。Haskell みたいな必要なところを必要なだけって評価のほうが脳に優しいのかも、とかはじめて思った。

昨日のコメントでも書いたけど、λの世界だと数も関数で表してしまうそうです。

http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%83%80%E8%A8%88%E7%AE%97

昨日とはちょっと違うけど JavaScript で。C# ってなんでラムダ式だと Func<T> hoge = みたく T を許してくれないんだろう。それが書けても型なしλの世界を書くのは大変だけど。

var ch0 = function(f) { return function(x) { return x } }
var ch1 = function(f) { return function(x) { return f(x) } }
var ch2 = function(f) { return function(x) { return f(f(x)) } }

1 は 0 に一回 +1 したもの、2 は 二回 +1 したもの、…、みたいに次々に関数を適用したものを数と考えるみたい。それを一般化したのが↑。

x に 0、f に +1 する関数を与えると普通の数字にできる。

var a = ( ch0( function(n) { return n + 1 } ) )( 0 )
var b = ( ch1( function(n) { return n + 1 } ) )( 0 )

これをチャーチ数と呼ぶそうな。大きな数字を数えるのは遠慮したい世界だなぁw

id:amachang さんが似たようなことしてて助かってたり。

[] λの世界  λの世界を含むブックマーク  λの世界のブックマークコメント

λ計算ってなんなの?って気になってたんだけど、「計算とは何か」ってことを研究するための道具ってことなのかな?数学で扱う関数の要素を抽出して作られたものがλ計算だそうな。「計算とは何か」なんて考えたこともなかった…。

Yコンビネーターってなんなの?ってのは、λ計算で扱うλ式たった3つの規則からなる定義なのに、Yコンビネーターを使えば再帰(つまりループ)ができちゃった、これですべての再帰的な関数が書けるようになったスゲー!ってこと。普通にループや再帰が書けるプログラムの世界では特に使う必要はないかと。

nsharpnsharp 2008/02/03 17:54 チャーチ数をC#で書いてみると、うーん、やっぱり効率悪そう・・・。(´・ω・`)

  static IEnumerable<Func<T, T>> Generate<T>(Func<T, T> func) {
    yield return x => x;
    yield return x => func(x);

    foreach (var f in Generate(func).Skip(1)) {
      yield return x => func(f(x));
    }
  }

  static void Main() {
    var nums = Generate((int n) => n + 1).Select(f => f(0));

    foreach (var n in nums.Take(10)) {
      Console.WriteLine(n);
    }
  }

nsharpnsharp 2008/02/03 18:02 間違えた。(´・ω・`)
再帰はこれだけで十分でした。

  static IEnumerable<Func<T, T>> Generate<T>(Func<T, T> func) {
    yield return x => x;

    foreach (var f in Generate(func)) {
      yield return x => func(f(x));
    }
  }

siokoshousiokoshou 2008/02/03 18:31 大きい数字を取り出すのが大変そう(^^;
+1ずつしながら数字を数えてるCPUを想像すると、けなげですねw

トラックバック - http://d.hatena.ne.jp/siokoshou/20080203

2008/2/2 (土)

[] `````````````.H.e.l.l.o.,. .w.o.r.l.d.!  `````````````.H.e.l.l.o.,. .w.o.r.l.d.!を含むブックマーク  `````````````.H.e.l.l.o.,. .w.o.r.l.d.!のブックマークコメント

猪股さんの「C#でYコンビネータ」の記事とそこからリンクされてる記事のたくさんの解説でλの世界に入門してみました。本も借りてきて読んでますが、これは厳しい((c)ひげぽんさん)って世界でまだ全然さっぱりですが、その途中で出会った不思議な言語 Unlambda。

http://hw001.gate01.com/eggplant/tcf/unlambda/

Hello Worldを書くのが精一杯、しかもほぼチュートリアルのコピペ。

`````````````.H.e.l.l.o.,. .w.o.r.l.d.!

次の一歩がまったく進めません(^^;

YとかIとかSとかKとかもっと知りたい。

[] Y  Yを含むブックマーク  Yのブックマークコメント

あーそうか。λの世界は関数に名前がない世界なのか!

f(x) = x + 2 を λx. x + 2 と書くのは名前を消してるのか!今ごろそこに気づいた。

なので、YM = M(YM) と書くのが反則で λy.(λx.y(xx))(λx.y(xx)) ならOKなのかー。やっと疑問が解けた。

参考: http://blog.livedoor.jp/dankogai/archives/50458503.html

やっと少しずつわかってきたような気がする。

nsharpnsharp 2008/02/02 13:34 こういうときはJavaScriptの出番ですね。(`・ω・´)

var Y = function(y) {
  return (function(x) {
    return y(function(a) {
      return (x(x))(a)
    })
  })(function(x) {
    return y(function(a) {
      return (x(x))(a)
    })
  })
}

var fact = function(f) {
  return function(n) {
    if (n == 0) {
      return 1
    }
    return n * f(n - 1)
  }
}

alert((Y(fact))(10))

siokoshousiokoshou 2008/02/02 14:07 さすがです!猪股さんのとこのコメントに、みずしまさんという方が C# でこれをやってしまったすごいコードがあります。
ちょうど今、↑でいう a について悩んでいるところだったりします…。これで遅延評価になって無限ループを防いでいるのかなぁ。う〜ん、考え中。

nsharpnsharp 2008/02/02 15:30 ここの解説が参考になりそうです。
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/35058

遅延させてるという解釈で合ってると思いますが、上側は a がなくても大丈夫なんですね。
うーむ、むずかしい・・・。(´・ω・`)

var Y = function(y) {
  return (function(x) {
    return y(x(x))
  })(function(x) {
    return y(function(a) {
      return x(x)(a)
    })
  })
}

siokoshousiokoshou 2008/02/02 16:11 おお、この解説はありがたい!まさにこれっぽいです。しかし…難しいw
ところで JavaScript まさにうってつけですね。チャーチ数が書けました。
var ch0 = function(x) { return function(f) { return x } }
var ch1 = function(x) { return function(f) { return f(x) } }
var ch2 = function(x) { return function(f) { return f(f(x)) } }

http://blog.livedoor.jp/dankogai/archives/50463152.html
http://blog.livedoor.jp/dankogai/archives/50458503.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20071101/286199/?P=2

しかし、succで早くもつまるという…続きはまた明日にします(^^;

siokoshousiokoshou 2008/02/02 16:12 あ、これも
var a = ( ch0( 0 ) )( function(n) { return n + 1 } )
var b = ( ch1( 0 ) )( function(n) { return n + 1 } )
...

トラックバック - http://d.hatena.ne.jp/siokoshou/20080202
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 09 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 12 |
2009 | 01 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 07 |
2011 | 04 | 07 | 10 |
2012 | 04 | 12 |
2013 | 08 |
2014 | 03 | 08 |
2017 | 09 |