次のコードはHaskellにあります。どのように私はC#で同様の関数を書くだろうか?Haskellを学ぶ:C#のリスト内包
上記のコードは、入力として円の半径を含むリストをとる関数です。この式は、入力リスト内の各円の面積を計算します。
私はC#で、リストをループしてリスト内の各円の面積を計算し、円の面積を含むリストを返すことで、同じ結果が得られることを知っています。私の質問は...上記のコードは、おそらくラムダ式やLINQを使用してC#で同様の方法で記述することができますか?
次のコードはHaskellにあります。どのように私はC#で同様の関数を書くだろうか?Haskellを学ぶ:C#のリスト内包
上記のコードは、入力として円の半径を含むリストをとる関数です。この式は、入力リスト内の各円の面積を計算します。
私はC#で、リストをループしてリスト内の各円の面積を計算し、円の面積を含むリストを返すことで、同じ結果が得られることを知っています。私の質問は...上記のコードは、おそらくラムダ式やLINQを使用してC#で同様の方法で記述することができますか?
:
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
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を使用して
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();
SquareAreaの両方のメソッドが同じですか?私の目は違いを見つけることができません:( – chollida
はい、私は含まれていた: rからxs select 2 * Math.PI * r * r; 最初の方法で、私は私の投稿を編集しましたそれを反映する。 –
Func<IEnumerable<Double>, IEnumerable<Double>>
squareArea = xs => xs.Select(r => Math.PI*r*r);
待ち、あなたは首都で始まる機能を持っていますか?それは違法ですか? – codebliss
なぜ2 * pi * rで面積を計算するのですか? π* r^2またはpi * r ** 2は行く方法ではありませんか? – Long
'2 * pi * r'は、その領域ではなく円の円周を計算します。 –