2012-01-10 15 views
2

多くの関数型言語で表示されるC#で固定小数点ジェネレータを定義しようとしました。私はfoldrが固定小数点ジェネレータの点で通常定義されると信じています。私はハスケルの定義であることを示し、それから私はC#で何を持っているかを示します。どんな助けでも大歓迎です。C#Genericの固定小数点ジェネレータ

//Haskell 
fix f = f (fix f) 

//C# (Many attempts) 
public static Func<Func<T, T>, T> Combinator1<T>(this Func<T, T> f) 
{ 
    return x => f(Combinator1(f)(x)); 
} 
public static Func<Func<T, T>, T> Combinator2<T>(this Func<T, T> f) 
{ 
    return x => x(Combinator2(x)(f)); 
} 
public static Func<T, U> Combinator3<T, U>(Func<Func<T, U>, Func<T, U>> f) 
{ 
    return f(x => Combinator3(f)(x)); 
} 
+1

どのような問題がありますか? – JaredPar

+1

@JaredPar私はまだそれを使って関数を構築しようとしていませんでしたが、正しい定義を取得しようとしていました。ありがとう。 –

+0

それでは、あなたは何を求めていますか? – JaredPar

答えて

4

私は、haskellまたはこの演算子について十分に理解していません。しかし、Mads TorgersenのC#ラムダ式を使ったY/Fixコンビネータの実装についての記事を読んでいます。それはあなたにいくつかの使用のかもしれない、ここにはlinkです。すべての

public Func<T, T> Fix<T>(Func<Func<T,T>, Func<T,T>> F) { 
    return t => F(Fix(F))(t); 
} 
+3

元の同僚のWes Dyerの同じ記事をご覧ください:http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous-recursion-in-c.aspx –

+0

@EricLippertありがとうございますリンク、私は最後にすべてのことを意味する時間を取っている – Lukazoid

+0

3つのすべての場合のように見えるおかげで私は多少間違っていた:)私は実際に私を混乱させた私はF#にハスケルの構文を貼り付けコピーしようとしたタイプを見てくださいが、F#は暗黙のxを見逃しました。それは あなたの助けをありがとうそんなにF#で「REC修正F X = F(修正F)xは聞かせて」 されている必要があります。 –

4

まず、Yコンビネータが型なしラムダ計算では、特定の実装である:ここ

そして、彼が実装して、最終的な方法です。より一般的には、固定小数点コンビネータについて話しています。

固定小数点結合子が実際にカレー化しないと意味をなさない理由は、ここに示したすべての回答が優れています。ルカゾイドによって与えられたものは、そうでなければならないほど一般的ではありません。これは、(Haskellの表記で)このタイプを有する:

lukazoidFix :: ((a -> b) -> a -> b) -> a -> b 

実不動点コンビネータがはるかに多型であるべきです。

fix :: (a -> a) -> a 
+0

私はそれが正常な順序の言語でのみ動作すると思います。 C#(またはMLファミリ)のような順応型言語では、ルカゾイドの答えは正しい。 – kvb

関連する問題