2009-12-04 14 views
9

次のコードはHaskellにあります。どのように私はC#で同様の関数を書くだろうか?Haskellを学ぶ:C#のリスト内包

上記のコードは、入力として円の半径を含むリストをとる関数です。この式は、入力リスト内の各円の面積を計算します。

私はC#で、リストをループしてリスト内の各円の面積を計算し、円の面積を含むリストを返すことで、同じ結果が得られることを知っています。私の質問は...上記のコードは、おそらくラムダ式やLINQを使用してC#で同様の方法で記述することができますか?

+0

待ち、あなたは首都で始まる機能を持っていますか?それは違法ですか? – codebliss

+0

なぜ2 * pi * rで面積を計算するのですか? π* r^2またはpi * r ** 2は行く方法ではありませんか? – Long

+1

'2 * pi * r'は、その領域ではなく円の円周を計算します。 –

答えて

22

IEnumerable<double> SquareArea(IEnumerable<int> xs) 
{ 
    return from r in xs select Math.PI * r * r; 
} 

または

IEnumerable<double> SquareArea(IEnumerable<int> xs) 
{ 
    return xs.Select(r => Math.PI * r * r); 
} 

squareArea xs = map (\r -> pi * r * r) xs 
+1

ラムダ式を使用しない方が簡単でしょうか? 'squareArea xs = map(2 * pi *)xs' –

+0

確かに。あなたは 'squareArea = map(2 * pi *)'を短縮することさえできますが、これはC#にはあまり近くありません。 – dtb

+2

またはsquareArea = map((* pi)。(^ 2)) '正しい式で – dtb

6
xs.Select(r => 2 * Math.PI * r * r) 

は右側です(私のブラウザでコードを書く、コンパイルされていないと思います)。一般的に

フォーム

[e | x1 <- x1s, x2 <- x2s, p] 

のHaskellのリストの内包は、おそらく

x1s.SelectMany(x1 => 
x2s.SelectMany(x2 => 
if p then return Enumerable.Singleton(e) else return Enumerable.Empty)) 

または

from x1 in x1s 
from x2 in x2s 
where p 
select e 

か何かのようなものです。ダーン、私は今それを修正する時間がありません、他の誰かがしてください(コミュニティWikiマーク)。 Enumerableを使用して

4

Haskellのに非常に近いあるDTBは、おそらくこれまでの最高のバージョンがありますが、それかかった場合さらに静的なクラスにメソッドを配置し、次のようにこの演算子を追加しました。

public static class MyMathFunctions 
{ 
    IEnumerable<double> SquareArea(this IEnumerable<int> xs) 
    { 
     return from r in xs select 2 * Math.PI * r * r; 
    } 

    IEnumerable<double> SquareAreaWithLambda(this IEnumerable<int> xs) 
    { 
     return xs.Select(r => 2 * Math.PI * r * r); 
    } 

} 

このように実行することができます:彼らはあなたのリストの一部であるかのようリットルの方法は

var myList = new List<int> { 1,2,3,4,5 }; 

var mySquareArea = myList.SquareArea(); 
+0

SquareAreaの両方のメソッドが同じですか?私の目は違いを見つけることができません:( – chollida

+1

はい、私は含まれていた: rからxs select 2 * Math.PI * r * r; 最初の方法で、私は私の投稿を編集しましたそれを反映する。 –

2
Func<IEnumerable<Double>, IEnumerable<Double>> 
    squareArea = xs => xs.Select(r => Math.PI*r*r);