2017-11-09 15 views
1

私はハスケルで次のように出会った:foldl (&&) True [False | _ <- [1..]]。私はfoldl関数が何をし、この式が無限再帰を含むのか知っていますが、この式は実際に何を意味していますか?私は主にこの文脈で|<-が何をするのか不明です。 3番目の引数はリストの内包によって定義されたリストであるハスケルオペレータの解釈

  1. (&&)
  2. True
  3. [False | _ <- [1..]]

+2

これは[list comprehension](https://wiki.haskell.org/List_comprehension)です – luqui

+0

どこを見ましたか? 'False'を書くのは長くて複雑な方法です。' && 'の最初のアプリケーションは' foldl'が(無限)リストの残りの部分を読む必要がないようにする 'False'値を生成します(' False' && _ == False')。さらに悪いことに、 'foldl'は無限リストの"終わり "から始まらなければならないので、決して終了しません。 – chepner

+0

プログラミングでは、このような式を関連する部分に分解することが重要です。これを解析といいます。この場合、 '|'と '<--'自体はあまり意味がありません。代わりに、解答の中で説明されているように、 'foldl'の引数を調べなければなりません。 –

答えて

5

この3つの引数に適用されるfoldl機能です。これは単にFalse値の無限配列であるリストは_の値ごとにFalse値で構築されている無限シーケンス1、2、3から引き出され、...それはより簡単repeat Falseとして定義することができる:

foldl (&&) True (repeat False) 
1

the haskell wiki about list-comprehensionをお読みください。

これは[ expr | expr <- expr ]です。これはリストの理解と呼ばれる構文です。

_は、この変数を無視することを意味し、|は、リスト内包式の左右の部分を区切るために使用されます。

1

foldl演算子は、リストを反復し、アキュムレータとリストの現在の場所でバイナリ演算子を呼び出して値を累積します。

I.e. (& &)は、AND演算子を使用して値TRUEに累積することを意味します。

最後の部分はここにあります。これはリストの理解です。これは、数学のクラスで見たセット表記法と似ています。基本的には、リストを定義しています。そのようなことを意味し、[1 ..]は1から無限までの各値をロードしていることを意味しますが、_にロードしているので無視されます。これは、Falseの無限リストを定義します。したがって、True & & Falseは常にFalseなので、最初のフォールドではfalseを返します。

これは機能すべてと同じだと思います。

+3

有限入力リストの 'Prelude.and'(' all'ではなく)と同じですが、少なくとも1つの 'False'を含む無限リストの場合、'と 'は' False'を返します。ここで 'foldl '決して戻ることはありません。 – amalloy