2011-10-04 9 views
6

私は現時点でハスケルと一緒に遊んでいるので、リストの理解機能に遭遇しました。ハスケルのクローズとリストの理解

Prelude> [x|x<-[1..7],x>4] -- list comprehension 
[5,6,7] 
Prelude> filter (\x->x>4) [1..7] -- closure 
[5,6,7] 

私はまだこの言語を感じていないので、Haskellのプログラマはどの道を行くだろう?当然のことながら、私はこの種のものを行うために閉鎖を使用しているだろう これら2つのソリューションの違いは何ですか?

+1

"閉鎖"の意味では "ラムダ式"を意味する "無名関数" – newacct

+0

@newacct:閉鎖はHaskellWikiで見つかった用語です。[リンク] http://www.haskell.org/haskellwiki/Closure あるいは、彼らはそこに何か異なるものを記述していますか? – Zakum

+1

"closure"は構文を記述するのではなく、関数が定義されているスコープからフリー変数を取得する機能についての概念です。このリンクは、特定の関数がフリー変数の周りをどのように閉じているかの例を示しています。使用される構文とは何の関係もありません。 – newacct

答えて

10

慣用的Haskellはあなたが閉鎖にレキシカルスコープのいずれかをキャプチャされていない、との代わりに区分演算子を利用しているfilter (> 4) [1..7]

注だろう。つまり、>という部分的なアプリケーションが必要です。このセクションでは、オペレータセクションがすぐにあなたに提供します。リスト内包は時には魅力的ですが、通常の認識では、通常の高次関数群(より複雑な構成に対しては「スケール」)ほどうまくスケールされません。もちろん、そのような文体的な決定は、主に主観的なものなので、YMMVです。

+1

これはまた、関数の構成を可能にしますが、リストの理解は行いません。 – ivanm

1

要素がやや複雑で、パターンマッチングでフィルタリングする必要がある場合や、マッピング部分がラムダ抽象化のために複雑すぎると感じられる場合、またはネストされたリストを扱わなければなりません。後者の場合、リストの理解は、(私にとっては、とにかく)代替よりも読みやすくなることがよくあります。以下のような例を何かのため

[ (f b, (g . fst) a) | (Just a, Right bs) <- somelist, a `notElem` bs, (_, b) <- bs ] 

しかし、あなたの例のために、セクション(>4)(\a -> a > 4)を書くには本当に良い方法であり、あなたが唯一のフィルタリングのためにそれを使用しているため、ほとんどの人はANthonysソリューションを好むだろう。